Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions build/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
/**
* @author Tom Pennetta <tpennetta@gmail.com>
* TODO: Don't reuse the same instance fo requestOptions for each call.
*/
import * as request from "request";
export declare enum NEO4J_PROTOCOL {
http = 0,
https = 1,
https = 1
}
export interface INeo4jInternalPaths {
extensions: any;
Expand Down Expand Up @@ -131,7 +135,7 @@ export declare function updateProperties(entityOrEntityId: INeo4jEntity | number
/**
* @param {number} nodeId
*/
export declare function getProperties(entityOrEntityId: INeo4jEntity | number, type: string): Promise<{}>;
export declare function getProperties(entityOrEntityId: INeo4jEntity | number, type: string): Promise<unknown>;
/**
* @param {number} nodeId
* @param {string} propertyName
Expand Down
12 changes: 7 additions & 5 deletions build/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
"use strict";
/**
* @author Tom Pennetta <tpennetta@gmail.com>
* TODO: Don't reuse the same instance fo requestOptions for each call.
*/
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRequestOptions = exports.setStreaming = exports.isStreaming = exports.isConnected = exports.deleteRelationship = exports.createRelationship = exports.getRelationship = exports.deleteAllProperties = exports.deleteProperty = exports.getProperty = exports.getProperties = exports.updateProperties = exports.setProperty = exports.getNodeDegree = exports.deleteNode = exports.createNode = exports.getNode = exports.cypher = exports.dropIndex = exports.listIndexesForLabel = exports.createIndex = exports.getAllPropertyKeys = exports.getRelationshipTypes = exports.connect = exports.NEO4J_PROTOCOL = void 0;
const url = require("url");
const request = require("request");
//==============================================================================
Expand All @@ -16,11 +18,11 @@ request.defaults({
//==============================================================================
// Global constants.
//==============================================================================
var NEO4J_PROTOCOL;
(function (NEO4J_PROTOCOL) {
NEO4J_PROTOCOL[NEO4J_PROTOCOL["http"] = 0] = "http";
NEO4J_PROTOCOL[NEO4J_PROTOCOL["https"] = 1] = "https";
})(exports.NEO4J_PROTOCOL || (exports.NEO4J_PROTOCOL = {}));
var NEO4J_PROTOCOL = exports.NEO4J_PROTOCOL;
})(NEO4J_PROTOCOL = exports.NEO4J_PROTOCOL || (exports.NEO4J_PROTOCOL = {}));
;
// TODO: Change to enums
const NEO4J_ENTITY_TYPES = ["node", "relationship"];
Expand Down Expand Up @@ -520,8 +522,8 @@ function createRelationship(startNode, toNode, type, data) {
}
let body = {
to: relationshipEndEndpointString,
type: type,
data: data
type,
data
};
try {
body = JSON.stringify(body);
Expand Down
17 changes: 7 additions & 10 deletions build/index.spec.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("mocha");
const chai = require("chai");
const neo4j = require("./index");
Expand All @@ -10,7 +11,7 @@ describe("Neo4j Typescript REST", function () {
port: 7474,
authentication: {
username: "neo4j",
password: "neo4j"
password: "BMFOTybl51qxqcqHBgK9"
},
streaming: true
};
Expand Down Expand Up @@ -148,15 +149,13 @@ describe("Neo4j Typescript REST", function () {
});
it("should execute several valid cypher statements", function (done) {
let validCypher = {
statements: [
{
statements: [{
statement: "MATCH (n) RETURN count(n)"
},
{
statement: "MATCH (x) RETURN x"
}
]
}]
};
validCypher.statements.push({
statement: "MATCH (x) RETURN x"
});
neo4j.cypher(validCypher)
.then((response) => {
done();
Expand All @@ -175,7 +174,6 @@ describe("Neo4j Typescript REST", function () {
};
neo4j.cypher(cypherRequest)
.then((response) => {
console.log(JSON.stringify(response, null, "\t"));
response.results[0].data[0].should.have.property("rest");
done();
})
Expand Down Expand Up @@ -474,7 +472,6 @@ describe("Neo4j Typescript REST", function () {
neo4j.deleteRelationship(sampleNewRelationship)
.then((response) => {
done();
;
})
.catch((reason) => {
done(reason);
Expand Down
13 changes: 8 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"name": "neo4j-typescript",
"version": "0.1.6",
"version": "2.0.0",
"description": "Typescript Library for Communicating with Neo4j over REST using Request",
"engines": {
"node": ">=4.0.0"
"node": ">=12.22.0"
},
"engineStrict": true,
"repository": {
Expand All @@ -13,10 +13,10 @@
"main": "build/index.js",
"typings": "build/index.d.ts",
"scripts": {
"prepublish": "typings install && npm run build",
"prepublish": "npx typings install && npm run build",
"build": "rm -rf build/* && tsc -p .",
"test": "tsc -p . && ./node_modules/.bin/istanbul cover -x \"**.spec.**\" ./node_modules/mocha/bin/_mocha --report lcovonly -- build/index.spec.js && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
"postinstall": "typings install"
"postinstall": "npx typings install"
},
"keywords": [
"typescript",
Expand All @@ -30,14 +30,17 @@
"request": "^2.69.0"
},
"devDependencies": {
"@types/chai": "^4.2.22",
"@types/mocha": "^9.0.0",
"@types/node": "^16.11.6",
"chai": "^3.5.0",
"coveralls": "^2.11.8",
"form-data": "^1.0.0-rc4",
"istanbul": "^0.4.2",
"mocha": "^2.4.5",
"mocha-lcov-reporter": "^1.2.0",
"tslint": "^3.6.0",
"typescript": "^1.8.9"
"typescript": "^3.9.10"
},
"bugs": {
"url": "https://github.com/tpennetta/neo4j-typescript/issues"
Expand Down
17 changes: 7 additions & 10 deletions src/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import "mocha";
import * as chai from "chai";
import * as util from "util";

import * as neo4j from "./index";
import * as request from "request";
Expand Down Expand Up @@ -30,7 +29,7 @@ describe("Neo4j Typescript REST", function() {
done(response);
})
.catch((reason) => {
done()
done();
});
});
it("should establish a new connection", function(done) {
Expand Down Expand Up @@ -153,15 +152,13 @@ describe("Neo4j Typescript REST", function() {
});
it("should execute several valid cypher statements", function(done) {
let validCypher: neo4j.INeo4jCypherRequest = {
statements: [
{
statements: [{
statement: "MATCH (n) RETURN count(n)"
},
{
statement: "MATCH (x) RETURN x"
}
]
}]
};
validCypher.statements.push({
statement: "MATCH (x) RETURN x"
});
neo4j.cypher(validCypher)
.then((response) => {
done();
Expand Down Expand Up @@ -482,7 +479,7 @@ describe("Neo4j Typescript REST", function() {
it("should delete newly created relationship", function(done) {
neo4j.deleteRelationship(sampleNewRelationship)
.then((response) => {
done();;
done();
})
.catch((reason) => {
done(reason);
Expand Down
40 changes: 19 additions & 21 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@
* TODO: Don't reuse the same instance fo requestOptions for each call.
*/

import * as path from "path";
import * as url from "url";
import * as request from "request";
import * as util from "util";
import * as http from "http";

//==============================================================================
Expand Down Expand Up @@ -83,16 +81,16 @@ export interface INeo4jCypherResponse {
data: [{
row: any[]
}]
}]
}];
errors: [{
code?: string,
message?: string
}]
}];
}

export interface INeo4jIndexResponse {
property_keys: string[],
label: string
property_keys: string[];
label: string;
}

export interface INeo4jEntity {
Expand Down Expand Up @@ -148,7 +146,7 @@ let dbConfigUrl: url.Url = null;
* @returns Promise
*/
export function connect(options: INeo4jConfig): Promise<INeo4jInternalPaths | string> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<INeo4jInternalPaths | string>((resolve, reject) => {
if (connected && graphPaths && url.parse(graphPaths.node).hostname === options.host) {
return resolve(graphPaths);
}
Expand Down Expand Up @@ -305,7 +303,7 @@ export function dropIndex(label: string, propertyName: string): Promise<boolean>
//==============================================================================

export function cypher(cypherStatements: INeo4jCypherRequest): Promise<INeo4jCypherResponse> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<INeo4jCypherResponse>((resolve, reject) => {
let cypherEndpointString: string = `${graphPaths.transaction}/commit`;
try {
requestOptions.body = JSON.stringify(cypherStatements);
Expand Down Expand Up @@ -338,7 +336,7 @@ export function cypher(cypherStatements: INeo4jCypherRequest): Promise<INeo4jCyp
* @returns Promise
*/
export function getNode(id: number): Promise<INode> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<INode>((resolve, reject) => {
let nodeEndpointString: string = `${graphPaths.node}/${id}`;
request.get(nodeEndpointString, requestOptions, (err, response, body) => {
if (err) {
Expand All @@ -359,7 +357,7 @@ export function getNode(id: number): Promise<INode> {
* @returns Promise
*/
export function createNode(data?: any): Promise<INode> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<INode>((resolve, reject) => {
let nodeEndpointString: string = graphPaths.node;
data = data || {};
requestOptions.body = typeof data !== "string" ? JSON.stringify(data) : data;
Expand All @@ -383,7 +381,7 @@ export function createNode(data?: any): Promise<INode> {
* @returns Promise
*/
export function deleteNode(id: number): Promise<boolean> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<boolean>((resolve, reject) => {
let nodeEndpointString: string = `${graphPaths.node}/${id}`;
request.del(nodeEndpointString, requestOptions, (err, response, body) => {
if (err) {
Expand All @@ -402,7 +400,7 @@ export function deleteNode(id: number): Promise<boolean> {
}

export function getNodeDegree(nodeOrNodeId: INode | number, direction?: string, type?: string): Promise<number> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<number>((resolve, reject) => {
let degreeEndpointString = `${_getNeo4jEntityUrl(nodeOrNodeId, "node")}/degree`;
direction = direction || "all";
if (direction && NEO4J_RELATIONSHIP_DIRECTION.indexOf(direction) !== -1) {
Expand All @@ -411,7 +409,7 @@ export function getNodeDegree(nodeOrNodeId: INode | number, direction?: string,
reject(`'direction' must be of value: ${NEO4J_RELATIONSHIP_DIRECTION}`);
}
if (type && typeof type === "string") {
degreeEndpointString = url.resolve(`${degreeEndpointString}/`, type)
degreeEndpointString = url.resolve(`${degreeEndpointString}/`, type);
}
request.get(degreeEndpointString, requestOptions, (err, response, body) => {
if (err) {
Expand All @@ -438,7 +436,7 @@ export function getNodeDegree(nodeOrNodeId: INode | number, direction?: string,
* @returns Promise
*/
export function setProperty(entityOrEntityId: INeo4jEntity | number, type: string, propertyName: string, data: number | string | boolean | number[] | string[] | boolean[]): Promise<boolean> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<boolean>((resolve, reject) => {
let propertyEndpointString: string = null;
try {
propertyEndpointString = `${_getNeo4jEntityUrl(entityOrEntityId, type)}/properties/${propertyName}`;
Expand Down Expand Up @@ -470,7 +468,7 @@ export function setProperty(entityOrEntityId: INeo4jEntity | number, type: strin
* @returns Promise
*/
export function updateProperties(entityOrEntityId: INeo4jEntity | number, type: string, data: any): Promise<boolean> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<boolean>((resolve, reject) => {
let entityId: number = null;

let propertiesEndpointString: string = `${_getNeo4jEntityUrl(entityOrEntityId, type)}/properties`;
Expand Down Expand Up @@ -521,7 +519,7 @@ export function getProperties(entityOrEntityId: INeo4jEntity | number, type: str
* @returns Promise
*/
export function getProperty(entityOrEntityId: INeo4jEntity | number, propertyName: string, type: string): Promise<number | string | boolean | number[] | string[] | boolean[]> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<number | string | boolean | number[] | string[] | boolean[]>((resolve, reject) => {
let propertyEndpointString: string = null;
try {
propertyEndpointString = `${_getNeo4jEntityUrl(entityOrEntityId, type)}/properties/${propertyName}`;
Expand All @@ -548,7 +546,7 @@ export function getProperty(entityOrEntityId: INeo4jEntity | number, propertyNam
* @returns Promise
*/
export function deleteProperty(entityOrEntityId: INeo4jEntity | number, propertyName: string, type: string): Promise<boolean> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<boolean>((resolve, reject) => {
let propertyEndpointString: string = null;
try {
propertyEndpointString = `${_getNeo4jEntityUrl(entityOrEntityId, type)}/properties/${propertyName}`;
Expand All @@ -573,7 +571,7 @@ export function deleteProperty(entityOrEntityId: INeo4jEntity | number, property
* @returns Promise
*/
export function deleteAllProperties(entityOrEntityId: INeo4jEntity | number, type: string): Promise<boolean> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<boolean>((resolve, reject) => {
let propertiesEndpointString: string = null;
try {
propertiesEndpointString = `${_getNeo4jEntityUrl(entityOrEntityId, type)}/properties`;
Expand All @@ -598,7 +596,7 @@ export function deleteAllProperties(entityOrEntityId: INeo4jEntity | number, typ
//==============================================================================

export function getRelationship(relationshipId: number | IRelationship, direction?: string, types?: string[]): Promise<IRelationship> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<IRelationship>((resolve, reject) => {
if (direction && NEO4J_RELATIONSHIP_DIRECTION.indexOf(direction) === -1) {
reject(`Relationship 'direction' must be of type: ${NEO4J_RELATIONSHIP_DIRECTION}`);
}
Expand All @@ -618,7 +616,7 @@ export function getRelationship(relationshipId: number | IRelationship, directio
}

export function createRelationship(startNode: INode | string | number, toNode: INode | string | number, type?: string, data?: any): Promise<IRelationship> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<IRelationship>((resolve, reject) => {
let relationshipStartEndpointString: string = null;
let relationshipEndEndpointString: string = null;
try {
Expand Down Expand Up @@ -654,7 +652,7 @@ export function createRelationship(startNode: INode | string | number, toNode: I
}

export function deleteRelationship(relationshipOrRelationshipId: number | IRelationship): Promise<boolean> {
let promise = new Promise((resolve, reject) => {
let promise = new Promise<boolean>((resolve, reject) => {
let relationshipEndpointString: string = _getNeo4jEntityUrl(relationshipOrRelationshipId, "relationship");
request.del(relationshipEndpointString, requestOptions, (err, response, body) => {
if (err) {
Expand Down
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
"files": [
"src/index.ts",
"src/index.spec.ts",
"typings/main.d.ts"
"typings/index.d.ts"
]
}