@comunica/bus-query-operation 2.7.0 → 2.8.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.
|
@@ -70,10 +70,9 @@ export declare abstract class ActorQueryOperation extends Actor<IActionQueryOper
|
|
|
70
70
|
/**
|
|
71
71
|
* Create an options object that can be used to construct a sparqlee asynchronous evaluator.
|
|
72
72
|
* @param context An action context.
|
|
73
|
-
* @param mediatorQueryOperation
|
|
74
|
-
* If defined, the existence resolver will be defined as `exists`.
|
|
73
|
+
* @param mediatorQueryOperation A query query operation mediator for resolving `exists`.
|
|
75
74
|
*/
|
|
76
|
-
static getAsyncExpressionContext(context: IActionContext, mediatorQueryOperation
|
|
75
|
+
static getAsyncExpressionContext(context: IActionContext, mediatorQueryOperation: MediatorQueryOperation): IAsyncExpressionContext;
|
|
77
76
|
/**
|
|
78
77
|
* Create an existence resolver for usage within an expression context.
|
|
79
78
|
* @param context An action context.
|
|
@@ -92,8 +91,8 @@ export interface IActionQueryOperation extends IAction {
|
|
|
92
91
|
*/
|
|
93
92
|
operation: Algebra.Operation;
|
|
94
93
|
}
|
|
95
|
-
export
|
|
96
|
-
export
|
|
94
|
+
export type IActorQueryOperationArgs = IActorArgs<IActionQueryOperation, IActorTest, IQueryOperationResult>;
|
|
95
|
+
export type MediatorQueryOperation = Mediate<IActionQueryOperation, IQueryOperationResult>;
|
|
97
96
|
export interface IBaseExpressionContext {
|
|
98
97
|
now?: Date;
|
|
99
98
|
baseIRI?: string;
|
|
@@ -134,18 +134,14 @@ class ActorQueryOperation extends core_1.Actor {
|
|
|
134
134
|
/**
|
|
135
135
|
* Create an options object that can be used to construct a sparqlee asynchronous evaluator.
|
|
136
136
|
* @param context An action context.
|
|
137
|
-
* @param mediatorQueryOperation
|
|
138
|
-
* If defined, the existence resolver will be defined as `exists`.
|
|
137
|
+
* @param mediatorQueryOperation A query query operation mediator for resolving `exists`.
|
|
139
138
|
*/
|
|
140
139
|
static getAsyncExpressionContext(context, mediatorQueryOperation) {
|
|
141
|
-
|
|
140
|
+
return {
|
|
142
141
|
...this.getBaseExpressionContext(context),
|
|
143
142
|
bnode: (input) => Promise.resolve(new data_factory_1.BlankNodeBindingsScoped(input || `BNODE_${bnodeCounter++}`)),
|
|
143
|
+
exists: ActorQueryOperation.createExistenceResolver(context, mediatorQueryOperation),
|
|
144
144
|
};
|
|
145
|
-
if (mediatorQueryOperation) {
|
|
146
|
-
expressionContext.exists = ActorQueryOperation.createExistenceResolver(context, mediatorQueryOperation);
|
|
147
|
-
}
|
|
148
|
-
return expressionContext;
|
|
149
145
|
}
|
|
150
146
|
/**
|
|
151
147
|
* Create an existence resolver for usage within an expression context.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActorQueryOperation.js","sourceRoot":"","sources":["ActorQueryOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeysInitQuery, KeysQueryOperation } from '@comunica/context-entries';\nimport type { IActorArgs, IActorTest, IAction, Mediate } from '@comunica/core';\nimport { Actor } from '@comunica/core';\nimport { BlankNodeBindingsScoped } from '@comunica/data-factory';\nimport type { IQueryOperationResult,\n IQueryOperationResultBindings,\n IQueryOperationResultBoolean,\n IQueryOperationResultQuads,\n IQueryOperationResultVoid,\n Bindings,\n IMetadata, IActionContext,\n FunctionArgumentsCache } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { Algebra } from 'sparqlalgebrajs';\nimport { materializeOperation } from './Bindings';\n\n/**\n * A counter that keeps track blank node generated through BNODE() SPARQL\n * expressions.\n *\n * @type {number}\n */\nlet bnodeCounter = 0;\n\n/**\n * A comunica actor for query-operation events.\n *\n * Actor types:\n * * Input: IActionQueryOperation: A SPARQL Algebra operation.\n * * Test: <none>\n * * Output: IActorQueryOperationOutput: A bindings stream.\n *\n * @see IActionQueryOperation\n * @see IQueryOperationResult\n */\nexport abstract class ActorQueryOperation extends Actor<IActionQueryOperation, IActorTest, IQueryOperationResult> {\n /**\n * @param args - @defaultNested {<default_bus> a <cbqo:components/BusQueryOperation.jsonld#BusQueryOperation>} bus\n */\n protected constructor(args: IActorQueryOperationArgs) {\n super(args);\n }\n\n /**\n * Safely cast a query operation output to a bindings output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultBindings} A bindings query operation output.\n */\n public static getSafeBindings(output: IQueryOperationResult): IQueryOperationResultBindings {\n ActorQueryOperation.validateQueryOutput(output, 'bindings');\n return <IQueryOperationResultBindings> output;\n }\n\n /**\n * Safely cast a query operation output to a quads output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultQuads} A quads query operation output.\n */\n public static getSafeQuads(output: IQueryOperationResult): IQueryOperationResultQuads {\n ActorQueryOperation.validateQueryOutput(output, 'quads');\n return <IQueryOperationResultQuads> output;\n }\n\n /**\n * Safely cast a query operation output to a boolean output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultBoolean} A boolean query operation output.\n */\n public static getSafeBoolean(output: IQueryOperationResult): IQueryOperationResultBoolean {\n ActorQueryOperation.validateQueryOutput(output, 'boolean');\n return <IQueryOperationResultBoolean> output;\n }\n\n /**\n * Safely cast a query operation output to a void output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultVoid} A void query operation output.\n */\n public static getSafeVoid(output: IQueryOperationResult): IQueryOperationResultVoid {\n ActorQueryOperation.validateQueryOutput(output, 'void');\n return <IQueryOperationResultVoid> output;\n }\n\n /**\n * Convert a metadata callback to a lazy callback where the response value is cached.\n * @param {() => Promise<IMetadata>} metadata A metadata callback\n * @return {() => Promise<{[p: string]: any}>} The callback where the response will be cached.\n */\n public static cachifyMetadata<M extends IMetadata<T>, T extends RDF.Variable | RDF.QuadTermName>(\n metadata: () => Promise<M>,\n ): () => Promise<M> {\n let lastReturn: Promise<M> | undefined;\n return () => {\n if (!lastReturn) {\n lastReturn = metadata();\n lastReturn\n .then(lastReturnValue => lastReturnValue.state.addInvalidateListener(() => {\n lastReturn = undefined;\n }))\n .catch(() => {\n // Ignore error\n });\n }\n return lastReturn;\n };\n }\n\n /**\n * Throw an error if the output type does not match the expected type.\n * @param {IQueryOperationResult} output A query operation output.\n * @param {string} expectedType The expected output type.\n */\n public static validateQueryOutput(output: IQueryOperationResult, expectedType: IQueryOperationResult['type']): void {\n if (output.type !== expectedType) {\n throw new Error(`Invalid query output type: Expected '${expectedType}' but got '${output.type}'`);\n }\n }\n\n protected static getBaseExpressionContext(context: IActionContext): IBaseExpressionContext {\n const now: Date | undefined = context.get(KeysInitQuery.queryTimestamp);\n const baseIRI: string | undefined = context.get(KeysInitQuery.baseIRI);\n const functionArgumentsCache: FunctionArgumentsCache = context.get(KeysInitQuery.functionArgumentsCache) || {};\n\n // Handle two variants of providing extension functions\n if (context.has(KeysInitQuery.extensionFunctionCreator) && context.has(KeysInitQuery.extensionFunctions)) {\n throw new Error('Illegal simultaneous usage of extensionFunctionCreator and extensionFunctions in context');\n }\n let extensionFunctionCreator: ((functionNamedNode: RDF.NamedNode) =>\n ((args: RDF.Term[]) => Promise<RDF.Term>) | undefined) | undefined = context\n .get(KeysInitQuery.extensionFunctionCreator);\n // Convert dictionary-based variant to callback\n const extensionFunctions: (Record<string, (args: RDF.Term[]) => Promise<RDF.Term>>) | undefined = context\n .get(KeysInitQuery.extensionFunctions);\n if (extensionFunctions) {\n extensionFunctionCreator = functionNamedNode => extensionFunctions[functionNamedNode.value];\n }\n\n return { now, baseIRI, extensionFunctionCreator, functionArgumentsCache };\n }\n\n /**\n * Create an options object that can be used to construct a sparqlee synchronous evaluator.\n * @param context An action context.\n * @param mediatorQueryOperation An optional query query operation mediator.\n * If defined, the existence resolver will be defined as `exists`.\n */\n public static getExpressionContext(context: IActionContext, mediatorQueryOperation?: MediatorQueryOperation):\n ISyncExpressionContext {\n return {\n ...this.getBaseExpressionContext(context),\n bnode: (input?: string) => new BlankNodeBindingsScoped(input || `BNODE_${bnodeCounter++}`),\n };\n }\n\n /**\n * Create an options object that can be used to construct a sparqlee asynchronous evaluator.\n * @param context An action context.\n * @param mediatorQueryOperation An optional query query operation mediator.\n * If defined, the existence resolver will be defined as `exists`.\n */\n public static getAsyncExpressionContext(context: IActionContext, mediatorQueryOperation?: MediatorQueryOperation):\n IAsyncExpressionContext {\n const expressionContext: IAsyncExpressionContext = {\n ...this.getBaseExpressionContext(context),\n bnode: (input?: string) => Promise.resolve(new BlankNodeBindingsScoped(input || `BNODE_${bnodeCounter++}`)),\n };\n if (mediatorQueryOperation) {\n expressionContext.exists = ActorQueryOperation.createExistenceResolver(context, mediatorQueryOperation);\n }\n return expressionContext;\n }\n\n /**\n * Create an existence resolver for usage within an expression context.\n * @param context An action context.\n * @param mediatorQueryOperation A query operation mediator.\n */\n public static createExistenceResolver(context: IActionContext, mediatorQueryOperation: MediatorQueryOperation):\n (expr: Algebra.ExistenceExpression, bindings: Bindings) => Promise<boolean> {\n return async(expr, bindings) => {\n const operation = materializeOperation(expr.input, bindings);\n\n const outputRaw = await mediatorQueryOperation.mediate({ operation, context });\n const output = ActorQueryOperation.getSafeBindings(outputRaw);\n\n return new Promise(\n (resolve, reject) => {\n output.bindingsStream.on('end', () => {\n resolve(false);\n });\n\n output.bindingsStream.on('error', reject);\n\n output.bindingsStream.on('data', () => {\n output.bindingsStream.close();\n resolve(true);\n });\n },\n )\n .then((exists: boolean) => expr.not ? !exists : exists);\n };\n }\n\n /**\n * Throw an error if the context contains the readOnly flag.\n * @param context An action context.\n */\n public static throwOnReadOnly(context: IActionContext): void {\n if (context.get(KeysQueryOperation.readOnly)) {\n throw new Error(`Attempted a write operation in read-only mode`);\n }\n }\n}\n\nexport interface IActionQueryOperation extends IAction {\n /**\n * The query operation to handle.\n */\n operation: Algebra.Operation;\n}\n\nexport type IActorQueryOperationArgs = IActorArgs<IActionQueryOperation, IActorTest, IQueryOperationResult>;\n\nexport type MediatorQueryOperation = Mediate<IActionQueryOperation, IQueryOperationResult>;\n\nexport interface IBaseExpressionContext {\n now?: Date;\n baseIRI?: string;\n extensionFunctionCreator?: (functionNamedNode: RDF.NamedNode) =>\n ((args: RDF.Term[]) => Promise<RDF.Term>) | undefined;\n functionArgumentsCache?: FunctionArgumentsCache;\n}\n\nexport interface ISyncExpressionContext extends IBaseExpressionContext {\n bnode: (input?: string | undefined) => RDF.BlankNode;\n}\n\nexport interface IAsyncExpressionContext extends IBaseExpressionContext {\n bnode: (input?: string | undefined) => Promise<RDF.BlankNode>;\n exists?: (expr: Algebra.ExistenceExpression, bindings: Bindings) => Promise<boolean>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ActorQueryOperation.js","sourceRoot":"","sources":["ActorQueryOperation.ts"],"names":[],"mappings":";;;AAAA,+DAA8E;AAE9E,yCAAuC;AACvC,yDAAiE;AAWjE,yCAAkD;AAElD;;;;;GAKG;AACH,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB;;;;;;;;;;GAUG;AACH,MAAsB,mBAAoB,SAAQ,YAA+D;IAC/G;;OAEG;IACH,YAAsB,IAA8B;QAClD,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,eAAe,CAAC,MAA6B;QACzD,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAuC,MAAM,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,YAAY,CAAC,MAA6B;QACtD,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzD,OAAoC,MAAM,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,cAAc,CAAC,MAA6B;QACxD,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3D,OAAsC,MAAM,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,MAA6B;QACrD,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxD,OAAmC,MAAM,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,eAAe,CAC3B,QAA0B;QAE1B,IAAI,UAAkC,CAAC;QACvC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,EAAE;gBACf,UAAU,GAAG,QAAQ,EAAE,CAAC;gBACxB,UAAU;qBACP,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,EAAE;oBACxE,UAAU,GAAG,SAAS,CAAC;gBACzB,CAAC,CAAC,CAAC;qBACF,KAAK,CAAC,GAAG,EAAE;oBACV,eAAe;gBACjB,CAAC,CAAC,CAAC;aACN;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,MAA6B,EAAE,YAA2C;QAC1G,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,wCAAwC,YAAY,cAAc,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;SACnG;IACH,CAAC;IAES,MAAM,CAAC,wBAAwB,CAAC,OAAuB;QAC/D,MAAM,GAAG,GAAqB,OAAO,CAAC,GAAG,CAAC,+BAAa,CAAC,cAAc,CAAC,CAAC;QACxE,MAAM,OAAO,GAAuB,OAAO,CAAC,GAAG,CAAC,+BAAa,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,sBAAsB,GAA2B,OAAO,CAAC,GAAG,CAAC,+BAAa,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;QAE/G,uDAAuD;QACvD,IAAI,OAAO,CAAC,GAAG,CAAC,+BAAa,CAAC,wBAAwB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,+BAAa,CAAC,kBAAkB,CAAC,EAAE;YACxG,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;SAC7G;QACD,IAAI,wBAAwB,GACyC,OAAO;aACzE,GAAG,CAAC,+BAAa,CAAC,wBAAwB,CAAC,CAAC;QAC/C,+CAA+C;QAC/C,MAAM,kBAAkB,GAA0E,OAAO;aACtG,GAAG,CAAC,+BAAa,CAAC,kBAAkB,CAAC,CAAC;QACzC,IAAI,kBAAkB,EAAE;YACtB,wBAAwB,GAAG,iBAAiB,CAAC,EAAE,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;SAC7F;QAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,OAAuB,EAAE,sBAA+C;QAEzG,OAAO;YACL,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;YACzC,KAAK,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,IAAI,sCAAuB,CAAC,KAAK,IAAI,SAAS,YAAY,EAAE,EAAE,CAAC;SAC3F,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,yBAAyB,CAAC,OAAuB,EAAE,sBAA8C;QAE7G,OAAO;YACL,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;YACzC,KAAK,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sCAAuB,CAAC,KAAK,IAAI,SAAS,YAAY,EAAE,EAAE,CAAC,CAAC;YAC3G,MAAM,EAAE,mBAAmB,CAAC,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,CAAC;SACrF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,uBAAuB,CAAC,OAAuB,EAAE,sBAA8C;QAE3G,OAAO,KAAK,EAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAA,+BAAoB,EAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAE7D,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,mBAAmB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAE9D,OAAO,IAAI,OAAO,CAChB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAClB,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACnC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAE1C,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACpC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC,CACF;iBACE,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAuB;QACnD,IAAI,OAAO,CAAC,GAAG,CAAC,oCAAkB,CAAC,QAAQ,CAAC,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;IACH,CAAC;CACF;AAjLD,kDAiLC","sourcesContent":["import { KeysInitQuery, KeysQueryOperation } from '@comunica/context-entries';\nimport type { IActorArgs, IActorTest, IAction, Mediate } from '@comunica/core';\nimport { Actor } from '@comunica/core';\nimport { BlankNodeBindingsScoped } from '@comunica/data-factory';\nimport type { IQueryOperationResult,\n IQueryOperationResultBindings,\n IQueryOperationResultBoolean,\n IQueryOperationResultQuads,\n IQueryOperationResultVoid,\n Bindings,\n IMetadata, IActionContext,\n FunctionArgumentsCache } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { Algebra } from 'sparqlalgebrajs';\nimport { materializeOperation } from './Bindings';\n\n/**\n * A counter that keeps track blank node generated through BNODE() SPARQL\n * expressions.\n *\n * @type {number}\n */\nlet bnodeCounter = 0;\n\n/**\n * A comunica actor for query-operation events.\n *\n * Actor types:\n * * Input: IActionQueryOperation: A SPARQL Algebra operation.\n * * Test: <none>\n * * Output: IActorQueryOperationOutput: A bindings stream.\n *\n * @see IActionQueryOperation\n * @see IQueryOperationResult\n */\nexport abstract class ActorQueryOperation extends Actor<IActionQueryOperation, IActorTest, IQueryOperationResult> {\n /**\n * @param args - @defaultNested {<default_bus> a <cbqo:components/BusQueryOperation.jsonld#BusQueryOperation>} bus\n */\n protected constructor(args: IActorQueryOperationArgs) {\n super(args);\n }\n\n /**\n * Safely cast a query operation output to a bindings output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultBindings} A bindings query operation output.\n */\n public static getSafeBindings(output: IQueryOperationResult): IQueryOperationResultBindings {\n ActorQueryOperation.validateQueryOutput(output, 'bindings');\n return <IQueryOperationResultBindings> output;\n }\n\n /**\n * Safely cast a query operation output to a quads output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultQuads} A quads query operation output.\n */\n public static getSafeQuads(output: IQueryOperationResult): IQueryOperationResultQuads {\n ActorQueryOperation.validateQueryOutput(output, 'quads');\n return <IQueryOperationResultQuads> output;\n }\n\n /**\n * Safely cast a query operation output to a boolean output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultBoolean} A boolean query operation output.\n */\n public static getSafeBoolean(output: IQueryOperationResult): IQueryOperationResultBoolean {\n ActorQueryOperation.validateQueryOutput(output, 'boolean');\n return <IQueryOperationResultBoolean> output;\n }\n\n /**\n * Safely cast a query operation output to a void output.\n * This will throw a runtime error if the output is of the incorrect type.\n * @param {IQueryOperationResult} output A query operation output.\n * @return {IQueryOperationResultVoid} A void query operation output.\n */\n public static getSafeVoid(output: IQueryOperationResult): IQueryOperationResultVoid {\n ActorQueryOperation.validateQueryOutput(output, 'void');\n return <IQueryOperationResultVoid> output;\n }\n\n /**\n * Convert a metadata callback to a lazy callback where the response value is cached.\n * @param {() => Promise<IMetadata>} metadata A metadata callback\n * @return {() => Promise<{[p: string]: any}>} The callback where the response will be cached.\n */\n public static cachifyMetadata<M extends IMetadata<T>, T extends RDF.Variable | RDF.QuadTermName>(\n metadata: () => Promise<M>,\n ): () => Promise<M> {\n let lastReturn: Promise<M> | undefined;\n return () => {\n if (!lastReturn) {\n lastReturn = metadata();\n lastReturn\n .then(lastReturnValue => lastReturnValue.state.addInvalidateListener(() => {\n lastReturn = undefined;\n }))\n .catch(() => {\n // Ignore error\n });\n }\n return lastReturn;\n };\n }\n\n /**\n * Throw an error if the output type does not match the expected type.\n * @param {IQueryOperationResult} output A query operation output.\n * @param {string} expectedType The expected output type.\n */\n public static validateQueryOutput(output: IQueryOperationResult, expectedType: IQueryOperationResult['type']): void {\n if (output.type !== expectedType) {\n throw new Error(`Invalid query output type: Expected '${expectedType}' but got '${output.type}'`);\n }\n }\n\n protected static getBaseExpressionContext(context: IActionContext): IBaseExpressionContext {\n const now: Date | undefined = context.get(KeysInitQuery.queryTimestamp);\n const baseIRI: string | undefined = context.get(KeysInitQuery.baseIRI);\n const functionArgumentsCache: FunctionArgumentsCache = context.get(KeysInitQuery.functionArgumentsCache) || {};\n\n // Handle two variants of providing extension functions\n if (context.has(KeysInitQuery.extensionFunctionCreator) && context.has(KeysInitQuery.extensionFunctions)) {\n throw new Error('Illegal simultaneous usage of extensionFunctionCreator and extensionFunctions in context');\n }\n let extensionFunctionCreator: ((functionNamedNode: RDF.NamedNode) =>\n ((args: RDF.Term[]) => Promise<RDF.Term>) | undefined) | undefined = context\n .get(KeysInitQuery.extensionFunctionCreator);\n // Convert dictionary-based variant to callback\n const extensionFunctions: (Record<string, (args: RDF.Term[]) => Promise<RDF.Term>>) | undefined = context\n .get(KeysInitQuery.extensionFunctions);\n if (extensionFunctions) {\n extensionFunctionCreator = functionNamedNode => extensionFunctions[functionNamedNode.value];\n }\n\n return { now, baseIRI, extensionFunctionCreator, functionArgumentsCache };\n }\n\n /**\n * Create an options object that can be used to construct a sparqlee synchronous evaluator.\n * @param context An action context.\n * @param mediatorQueryOperation An optional query query operation mediator.\n * If defined, the existence resolver will be defined as `exists`.\n */\n public static getExpressionContext(context: IActionContext, mediatorQueryOperation?: MediatorQueryOperation):\n ISyncExpressionContext {\n return {\n ...this.getBaseExpressionContext(context),\n bnode: (input?: string) => new BlankNodeBindingsScoped(input || `BNODE_${bnodeCounter++}`),\n };\n }\n\n /**\n * Create an options object that can be used to construct a sparqlee asynchronous evaluator.\n * @param context An action context.\n * @param mediatorQueryOperation A query query operation mediator for resolving `exists`.\n */\n public static getAsyncExpressionContext(context: IActionContext, mediatorQueryOperation: MediatorQueryOperation):\n IAsyncExpressionContext {\n return {\n ...this.getBaseExpressionContext(context),\n bnode: (input?: string) => Promise.resolve(new BlankNodeBindingsScoped(input || `BNODE_${bnodeCounter++}`)),\n exists: ActorQueryOperation.createExistenceResolver(context, mediatorQueryOperation),\n };\n }\n\n /**\n * Create an existence resolver for usage within an expression context.\n * @param context An action context.\n * @param mediatorQueryOperation A query operation mediator.\n */\n public static createExistenceResolver(context: IActionContext, mediatorQueryOperation: MediatorQueryOperation):\n (expr: Algebra.ExistenceExpression, bindings: Bindings) => Promise<boolean> {\n return async(expr, bindings) => {\n const operation = materializeOperation(expr.input, bindings);\n\n const outputRaw = await mediatorQueryOperation.mediate({ operation, context });\n const output = ActorQueryOperation.getSafeBindings(outputRaw);\n\n return new Promise(\n (resolve, reject) => {\n output.bindingsStream.on('end', () => {\n resolve(false);\n });\n\n output.bindingsStream.on('error', reject);\n\n output.bindingsStream.on('data', () => {\n output.bindingsStream.close();\n resolve(true);\n });\n },\n )\n .then((exists: boolean) => expr.not ? !exists : exists);\n };\n }\n\n /**\n * Throw an error if the context contains the readOnly flag.\n * @param context An action context.\n */\n public static throwOnReadOnly(context: IActionContext): void {\n if (context.get(KeysQueryOperation.readOnly)) {\n throw new Error(`Attempted a write operation in read-only mode`);\n }\n }\n}\n\nexport interface IActionQueryOperation extends IAction {\n /**\n * The query operation to handle.\n */\n operation: Algebra.Operation;\n}\n\nexport type IActorQueryOperationArgs = IActorArgs<IActionQueryOperation, IActorTest, IQueryOperationResult>;\n\nexport type MediatorQueryOperation = Mediate<IActionQueryOperation, IQueryOperationResult>;\n\nexport interface IBaseExpressionContext {\n now?: Date;\n baseIRI?: string;\n extensionFunctionCreator?: (functionNamedNode: RDF.NamedNode) =>\n ((args: RDF.Term[]) => Promise<RDF.Term>) | undefined;\n functionArgumentsCache?: FunctionArgumentsCache;\n}\n\nexport interface ISyncExpressionContext extends IBaseExpressionContext {\n bnode: (input?: string | undefined) => RDF.BlankNode;\n}\n\nexport interface IAsyncExpressionContext extends IBaseExpressionContext {\n bnode: (input?: string | undefined) => Promise<RDF.BlankNode>;\n exists?: (expr: Algebra.ExistenceExpression, bindings: Bindings) => Promise<boolean>;\n}\n"]}
|
package/lib/Bindings.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.materializeOperation = exports.materializeTerm = void 0;
|
|
4
4
|
const bindings_factory_1 = require("@comunica/bindings-factory");
|
|
5
5
|
const rdf_string_1 = require("rdf-string");
|
|
6
|
+
const rdf_terms_1 = require("rdf-terms");
|
|
6
7
|
const sparqlalgebrajs_1 = require("sparqlalgebrajs");
|
|
7
8
|
const BF = new bindings_factory_1.BindingsFactory();
|
|
8
9
|
/**
|
|
@@ -24,6 +25,9 @@ function materializeTerm(term, bindings) {
|
|
|
24
25
|
return value;
|
|
25
26
|
}
|
|
26
27
|
}
|
|
28
|
+
if (term.termType === 'Quad' && (0, rdf_terms_1.someTermsNested)(term, value => value.termType === 'Variable')) {
|
|
29
|
+
return (0, rdf_terms_1.mapTermsNested)(term, subTerm => materializeTerm(subTerm, bindings));
|
|
30
|
+
}
|
|
27
31
|
return term;
|
|
28
32
|
}
|
|
29
33
|
exports.materializeTerm = materializeTerm;
|
package/lib/Bindings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bindings.js","sourceRoot":"","sources":["Bindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { BindingsFactory } from '@comunica/bindings-factory';\nimport type { Bindings } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport { termToString } from 'rdf-string';\nimport type { Algebra, Factory } from 'sparqlalgebrajs';\nimport { Util } from 'sparqlalgebrajs';\n\nconst BF = new BindingsFactory();\n\n/**\n * Materialize a term with the given binding.\n *\n * If the given term is a variable,\n * and that variable exist in the given bindings object,\n * the value of that binding is returned.\n * In all other cases, the term itself is returned.\n *\n * @param {RDF.Term} term A term.\n * @param {Bindings} bindings A bindings object.\n * @return {RDF.Term} The materialized term.\n */\nexport function materializeTerm(term: RDF.Term, bindings: Bindings): RDF.Term {\n if (term.termType === 'Variable') {\n const value = bindings.get(term);\n if (value) {\n return value;\n }\n }\n return term;\n}\n\n/**\n * Materialize the given operation (recursively) with the given bindings.\n * Essentially, all variables in the given operation will be replaced\n * by the terms bound to the variables in the given bindings.\n * @param {Operation} operation SPARQL algebra operation.\n * @param {Bindings} bindings A bindings object.\n * @param options Options for materializations.\n * @return Algebra.Operation A new operation materialized with the given bindings.\n */\nexport function materializeOperation(\n operation: Algebra.Operation,\n bindings: Bindings,\n options: {\n /**\n * If target variable bindings (such as on SELECT or BIND) should not be allowed.\n */\n strictTargetVariables?: boolean;\n /**\n * If filter expressions should be materialized\n */\n bindFilter?: boolean;\n } = {},\n): Algebra.Operation {\n options = {\n strictTargetVariables: 'strictTargetVariables' in options ? options.strictTargetVariables : false,\n bindFilter: 'bindFilter' in options ? options.bindFilter : true,\n };\n\n return Util.mapOperation(operation, {\n path(op: Algebra.Path, factory: Factory) {\n // Materialize variables in a path expression.\n // The predicate expression will be recursed.\n return {\n recurse: false,\n result: factory.createPath(\n materializeTerm(op.subject, bindings),\n op.predicate,\n materializeTerm(op.object, bindings),\n materializeTerm(op.graph, bindings),\n ),\n };\n },\n pattern(op: Algebra.Pattern, factory: Factory) {\n // Materialize variables in the quad pattern.\n return {\n recurse: false,\n result: factory.createPattern(\n materializeTerm(op.subject, bindings),\n materializeTerm(op.predicate, bindings),\n materializeTerm(op.object, bindings),\n materializeTerm(op.graph, bindings),\n ),\n };\n },\n extend(op: Algebra.Extend) {\n // Materialize an extend operation.\n // If strictTargetVariables is true, we throw if the extension target variable is attempted to be bound.\n // Otherwise, we remove the extend operation.\n if (bindings.has(op.variable)) {\n if (options.strictTargetVariables) {\n throw new Error(`Tried to bind variable ${termToString(op.variable)} in a BIND operator.`);\n } else {\n return {\n recurse: true,\n result: materializeOperation(op.input, bindings, options),\n };\n }\n }\n return {\n recurse: true,\n result: op,\n };\n },\n group(op: Algebra.Group, factory: Factory) {\n // Materialize a group operation.\n // If strictTargetVariables is true, we throw if the group target variable is attempted to be bound.\n // Otherwise, we just filter out the bound variables.\n if (options.strictTargetVariables) {\n for (const variable of op.variables) {\n if (bindings.has(variable)) {\n throw new Error(`Tried to bind variable ${termToString(variable)} in a GROUP BY operator.`);\n }\n }\n return {\n recurse: true,\n result: op,\n };\n }\n const variables = op.variables.filter(variable => !bindings.has(variable));\n return {\n recurse: true,\n result: factory.createGroup(\n op.input,\n variables,\n op.aggregates,\n ),\n };\n },\n project(op: Algebra.Project, factory: Factory) {\n // Materialize a project operation.\n // If strictTargetVariables is true, we throw if the project target variable is attempted to be bound.\n // Otherwise, we just filter out the bound variables.\n if (options.strictTargetVariables) {\n for (const variable of op.variables) {\n if (bindings.has(variable)) {\n throw new Error(`Tried to bind variable ${termToString(variable)} in a SELECT operator.`);\n }\n }\n return {\n recurse: true,\n result: op,\n };\n }\n\n const variables = op.variables.filter(variable => !bindings.has(variable));\n\n // Only include projected variables in the sub-bindings that will be passed down recursively.\n // If we don't do this, we may be binding variables that may have the same label, but are not considered equal.\n const subBindings = BF.bindings(<[RDF.Variable, RDF.Term][]> op.variables.map(variable => {\n const binding = bindings.get(variable);\n if (binding) {\n return [ variable, binding ];\n }\n // eslint-disable-next-line no-useless-return\n return;\n }).filter(entry => Boolean(entry)));\n\n return {\n recurse: false,\n result: factory.createProject(\n materializeOperation(\n op.input,\n subBindings,\n options,\n ),\n variables,\n ),\n };\n },\n values(op: Algebra.Values, factory: Factory) {\n // Materialize a values operation.\n // If strictTargetVariables is true, we throw if the values target variable is attempted to be bound.\n // Otherwise, we just filter out the bound variables and their bindings.\n if (options.strictTargetVariables) {\n for (const variable of op.variables) {\n if (bindings.has(variable)) {\n throw new Error(`Tried to bind variable ${termToString(variable)} in a VALUES operator.`);\n }\n }\n } else {\n const variables = op.variables.filter(variable => !bindings.has(variable));\n const valueBindings: Record<string, RDF.Literal | RDF.NamedNode>[] = <any> op.bindings.map(binding => {\n const newBinding = { ...binding };\n let valid = true;\n bindings.forEach((value: RDF.NamedNode, key: RDF.Variable) => {\n const keyString = termToString(key);\n if (keyString in newBinding) {\n if (!value.equals(newBinding[keyString])) {\n // If the value of the binding is not equal, remove this binding completely from the VALUES clause\n valid = false;\n }\n delete newBinding[keyString];\n }\n });\n return valid ? newBinding : undefined;\n }).filter(Boolean);\n return {\n recurse: true,\n result: factory.createValues(\n variables,\n valueBindings,\n ),\n };\n }\n return {\n recurse: false,\n result: op,\n };\n },\n expression(op: Algebra.Expression, factory: Factory) {\n if (!options.bindFilter) {\n return {\n recurse: false,\n result: op,\n };\n }\n\n if (op.expressionType === 'term') {\n // Materialize a term expression\n return {\n recurse: false,\n result: factory.createTermExpression(materializeTerm(op.term, bindings)),\n };\n }\n if (op.expressionType === 'aggregate' &&\n 'variable' in op &&\n bindings.has(<RDF.Variable> op.variable)) {\n // Materialize a bound aggregate operation.\n // If strictTargetVariables is true, we throw if the expression target variable is attempted to be bound.\n // Otherwise, we ignore this operation.\n if (options.strictTargetVariables) {\n throw new Error(`Tried to bind ${termToString(op.variable)} in a ${op.aggregator} aggregate.`);\n } else {\n return {\n recurse: true,\n result: op,\n };\n }\n }\n return {\n recurse: true,\n result: op,\n };\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Bindings.js","sourceRoot":"","sources":["Bindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { BindingsFactory } from '@comunica/bindings-factory';\nimport type { Bindings } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport { termToString } from 'rdf-string';\nimport { mapTermsNested, someTermsNested } from 'rdf-terms';\nimport type { Algebra, Factory } from 'sparqlalgebrajs';\nimport { Util } from 'sparqlalgebrajs';\n\nconst BF = new BindingsFactory();\n\n/**\n * Materialize a term with the given binding.\n *\n * If the given term is a variable,\n * and that variable exist in the given bindings object,\n * the value of that binding is returned.\n * In all other cases, the term itself is returned.\n *\n * @param {RDF.Term} term A term.\n * @param {Bindings} bindings A bindings object.\n * @return {RDF.Term} The materialized term.\n */\nexport function materializeTerm(term: RDF.Term, bindings: Bindings): RDF.Term {\n if (term.termType === 'Variable') {\n const value = bindings.get(term);\n if (value) {\n return value;\n }\n }\n if (term.termType === 'Quad' && someTermsNested(term, value => value.termType === 'Variable')) {\n return mapTermsNested(term, subTerm => materializeTerm(subTerm, bindings));\n }\n return term;\n}\n\n/**\n * Materialize the given operation (recursively) with the given bindings.\n * Essentially, all variables in the given operation will be replaced\n * by the terms bound to the variables in the given bindings.\n * @param {Operation} operation SPARQL algebra operation.\n * @param {Bindings} bindings A bindings object.\n * @param options Options for materializations.\n * @return Algebra.Operation A new operation materialized with the given bindings.\n */\nexport function materializeOperation(\n operation: Algebra.Operation,\n bindings: Bindings,\n options: {\n /**\n * If target variable bindings (such as on SELECT or BIND) should not be allowed.\n */\n strictTargetVariables?: boolean;\n /**\n * If filter expressions should be materialized\n */\n bindFilter?: boolean;\n } = {},\n): Algebra.Operation {\n options = {\n strictTargetVariables: 'strictTargetVariables' in options ? options.strictTargetVariables : false,\n bindFilter: 'bindFilter' in options ? options.bindFilter : true,\n };\n\n return Util.mapOperation(operation, {\n path(op: Algebra.Path, factory: Factory) {\n // Materialize variables in a path expression.\n // The predicate expression will be recursed.\n return {\n recurse: false,\n result: factory.createPath(\n materializeTerm(op.subject, bindings),\n op.predicate,\n materializeTerm(op.object, bindings),\n materializeTerm(op.graph, bindings),\n ),\n };\n },\n pattern(op: Algebra.Pattern, factory: Factory) {\n // Materialize variables in the quad pattern.\n return {\n recurse: false,\n result: factory.createPattern(\n materializeTerm(op.subject, bindings),\n materializeTerm(op.predicate, bindings),\n materializeTerm(op.object, bindings),\n materializeTerm(op.graph, bindings),\n ),\n };\n },\n extend(op: Algebra.Extend) {\n // Materialize an extend operation.\n // If strictTargetVariables is true, we throw if the extension target variable is attempted to be bound.\n // Otherwise, we remove the extend operation.\n if (bindings.has(op.variable)) {\n if (options.strictTargetVariables) {\n throw new Error(`Tried to bind variable ${termToString(op.variable)} in a BIND operator.`);\n } else {\n return {\n recurse: true,\n result: materializeOperation(op.input, bindings, options),\n };\n }\n }\n return {\n recurse: true,\n result: op,\n };\n },\n group(op: Algebra.Group, factory: Factory) {\n // Materialize a group operation.\n // If strictTargetVariables is true, we throw if the group target variable is attempted to be bound.\n // Otherwise, we just filter out the bound variables.\n if (options.strictTargetVariables) {\n for (const variable of op.variables) {\n if (bindings.has(variable)) {\n throw new Error(`Tried to bind variable ${termToString(variable)} in a GROUP BY operator.`);\n }\n }\n return {\n recurse: true,\n result: op,\n };\n }\n const variables = op.variables.filter(variable => !bindings.has(variable));\n return {\n recurse: true,\n result: factory.createGroup(\n op.input,\n variables,\n op.aggregates,\n ),\n };\n },\n project(op: Algebra.Project, factory: Factory) {\n // Materialize a project operation.\n // If strictTargetVariables is true, we throw if the project target variable is attempted to be bound.\n // Otherwise, we just filter out the bound variables.\n if (options.strictTargetVariables) {\n for (const variable of op.variables) {\n if (bindings.has(variable)) {\n throw new Error(`Tried to bind variable ${termToString(variable)} in a SELECT operator.`);\n }\n }\n return {\n recurse: true,\n result: op,\n };\n }\n\n const variables = op.variables.filter(variable => !bindings.has(variable));\n\n // Only include projected variables in the sub-bindings that will be passed down recursively.\n // If we don't do this, we may be binding variables that may have the same label, but are not considered equal.\n const subBindings = BF.bindings(<[RDF.Variable, RDF.Term][]> op.variables.map(variable => {\n const binding = bindings.get(variable);\n if (binding) {\n return [ variable, binding ];\n }\n // eslint-disable-next-line no-useless-return\n return;\n }).filter(entry => Boolean(entry)));\n\n return {\n recurse: false,\n result: factory.createProject(\n materializeOperation(\n op.input,\n subBindings,\n options,\n ),\n variables,\n ),\n };\n },\n values(op: Algebra.Values, factory: Factory) {\n // Materialize a values operation.\n // If strictTargetVariables is true, we throw if the values target variable is attempted to be bound.\n // Otherwise, we just filter out the bound variables and their bindings.\n if (options.strictTargetVariables) {\n for (const variable of op.variables) {\n if (bindings.has(variable)) {\n throw new Error(`Tried to bind variable ${termToString(variable)} in a VALUES operator.`);\n }\n }\n } else {\n const variables = op.variables.filter(variable => !bindings.has(variable));\n const valueBindings: Record<string, RDF.Literal | RDF.NamedNode>[] = <any> op.bindings.map(binding => {\n const newBinding = { ...binding };\n let valid = true;\n bindings.forEach((value: RDF.NamedNode, key: RDF.Variable) => {\n const keyString = termToString(key);\n if (keyString in newBinding) {\n if (!value.equals(newBinding[keyString])) {\n // If the value of the binding is not equal, remove this binding completely from the VALUES clause\n valid = false;\n }\n delete newBinding[keyString];\n }\n });\n return valid ? newBinding : undefined;\n }).filter(Boolean);\n return {\n recurse: true,\n result: factory.createValues(\n variables,\n valueBindings,\n ),\n };\n }\n return {\n recurse: false,\n result: op,\n };\n },\n expression(op: Algebra.Expression, factory: Factory) {\n if (!options.bindFilter) {\n return {\n recurse: false,\n result: op,\n };\n }\n\n if (op.expressionType === 'term') {\n // Materialize a term expression\n return {\n recurse: false,\n result: factory.createTermExpression(materializeTerm(op.term, bindings)),\n };\n }\n if (op.expressionType === 'aggregate' &&\n 'variable' in op &&\n bindings.has(<RDF.Variable> op.variable)) {\n // Materialize a bound aggregate operation.\n // If strictTargetVariables is true, we throw if the expression target variable is attempted to be bound.\n // Otherwise, we ignore this operation.\n if (options.strictTargetVariables) {\n throw new Error(`Tried to bind ${termToString(op.variable)} in a ${op.aggregator} aggregate.`);\n } else {\n return {\n recurse: true,\n result: op,\n };\n }\n }\n return {\n recurse: true,\n result: op,\n };\n },\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/bus-query-operation",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "A comunica bus for query-operation events.",
|
|
5
5
|
"lsd:module": true,
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -32,19 +32,20 @@
|
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@comunica/bindings-factory": "^2.7.0",
|
|
35
|
-
"@comunica/context-entries": "^2.
|
|
36
|
-
"@comunica/core": "^2.
|
|
35
|
+
"@comunica/context-entries": "^2.8.0",
|
|
36
|
+
"@comunica/core": "^2.8.0",
|
|
37
37
|
"@comunica/data-factory": "^2.7.0",
|
|
38
|
-
"@comunica/types": "^2.
|
|
38
|
+
"@comunica/types": "^2.8.0",
|
|
39
39
|
"@rdfjs/types": "*",
|
|
40
40
|
"asynciterator": "^3.8.0",
|
|
41
41
|
"rdf-string": "^1.6.1",
|
|
42
|
-
"
|
|
42
|
+
"rdf-terms": "^1.11.0",
|
|
43
|
+
"sparqlalgebrajs": "^4.2.0"
|
|
43
44
|
},
|
|
44
45
|
"scripts": {
|
|
45
46
|
"build": "npm run build:ts && npm run build:components",
|
|
46
47
|
"build:ts": "node \"../../node_modules/typescript/bin/tsc\"",
|
|
47
48
|
"build:components": "componentsjs-generator"
|
|
48
49
|
},
|
|
49
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "2459c84cb0ddc959436d8742f1f7b2805ce09825"
|
|
50
51
|
}
|