New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

graphql-query-factory

Package Overview
Dependencies
Maintainers
1
Versions
24
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

graphql-query-factory - npm Package Compare versions

Comparing version 1.0.19 to 1.0.20

dist/factory.js

89

dist/batcher.js
"use strict";
const fetch = require("node-fetch");
global.fetch = fetch;
const { ApolloClient, createNetworkInterface } = require("apollo-client");
const gql = require("graphql-tag");
const { GraphQLClient, request } = require("graphql-request");
const chalk = require("chalk");
const log = console.log;
function batcher(queries, concurrent = 4) {
let batcherHandle = new QueryBatcher(queries, concurrent);
let executedBatchPromise = batcherHandle.queryBatchExecute();
return executedBatchPromise;
}
class QueryBatcher {
constructor(queries, concurrent = 4) {
this.queries = queries;
this.concurrent = concurrent;
const client = new GraphQLClient(process && process.env && process.env.GQL_SIMPLE_ENDPOINT || "https://api.graph.cool/simple/v1/cj7rzel6x02b40143fhkupzik", {
headers: {
Authorization: `Bearer ${process && process.env && process.env.GQL_AUTH_TOKEN || "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MDU4NDkxNTIsImNsaWVudElkIjoiY2oxYzRqZ3Axa2lwdzAxMDV4MDVmZTRuNSIsInByb2plY3RJZCI6ImNqN3J6ZWw2eDAyYjQwMTQzZmhrdXB6aWsiLCJwZXJtYW5lbnRBdXRoVG9rZW5JZCI6ImNqN3J6cGVidDAyeTQwMTU1cG9odnllNGgifQ.ZA2zNCIvzrkUrASxkuZbX26rvHfsbKHK2V53J5CwQi4"}`
}
getQueries() {
return this.queries;
}
setQueries(arrayOfQueryStrings) {
this.queries = arrayOfQueryStrings;
}
getConcurrent() {
return this.concurrent;
}
setConcurrent(numberOfConcurrentConnections) {
this.concurrent = numberOfConcurrentConnections;
}
async queryBatchExecute() {
let queries = this.getQueries();
let concurrent = this.getConcurrent();
let sliced = this.sliceQueryArray(queries, concurrent);
let res = Promise.all(sliced.target.map(this.queryExecute));
return res;
}
});
async queryExecute(query) {
const client = new ApolloClient({
networkInterface: createNetworkInterface({
uri: process && process.env && process.env.GQL_SIMPLE_ENDPOINT || "https://api.graph.cool/simple/v1/cj7rzel6x02b40143fhkupzik",
opts: {
headers: { Authorization: process && process.env && process.env.GQL_AUTH_TOKEN || "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MDU4NDkxNTIsImNsaWVudElkIjoiY2oxYzRqZ3Axa2lwdzAxMDV4MDVmZTRuNSIsInByb2plY3RJZCI6ImNqN3J6ZWw2eDAyYjQwMTQzZmhrdXB6aWsiLCJwZXJtYW5lbnRBdXRoVG9rZW5JZCI6ImNqN3J6cGVidDAyeTQwMTU1cG9odnllNGgifQ.ZA2zNCIvzrkUrASxkuZbX26rvHfsbKHK2V53J5CwQi4" }
}
})
function queryExecute(query) {
return new Promise((resolve, reject) => {
request(process && process.env && process.env.GQL_SIMPLE_ENDPOINT || "https://api.graph.cool/simple/v1/cj7rzel6x02b40143fhkupzik", query).then(data => {
resolve(data);
}).catch(err => {
log(err.response.errors);
log(err.response.data);
reject(err);
});
try {
return await client.mutate({ mutation: gql`${query}` });
} catch (error) {
log(`\n${chalk.red("queryExecute() in " + this.constructor.name + " failed.")} ${chalk.red(error)}\n`);
}
}
sliceQueryArray() {
let original = this.getQueries();
let concurrent = this.getConcurrent();
let target = original.slice(0, concurrent);
original = original.slice(concurrent, original.length);
// log(`${chalk.green('\nTarget\n---------------------------------\n')} ${target.toString()}`);
// log(`${chalk.green('\nOriginal\n---------------------------------\n')} ${original.toString()}`);
let queries = {
target: [...target],
original: [...original]
};
return queries;
}
});
}
module.exports = {
batcher,
QueryBatcher
};
function queryExecuteBatch(arrayOfQueries) {
let resp = Promise.all(arrayOfQueries.map(query => queryExecute(query)));
return resp;
}
let batcher = {
request: queryExecute,
batch: queryExecuteBatch
};
module.exports = batcher;
"use strict";
const chalk = require("chalk"); //https://www.npmjs.com/package/chalk
const gql = require("graphql-tag");
const log = console.log;

@@ -54,3 +53,2 @@

let regex = /\$\w+/g;
// let regex = /\$\w+(?=[\):])/g;
let queryParams = query.match(regex);

@@ -73,3 +71,3 @@ if (queryParams !== null) {

inc++;
return inc == 1 ? value : match;
return inc == 1 ? `"${value}"` : match;
});

@@ -97,5 +95,2 @@ query = queryNew;

module.exports = {
QueryBuilder,
builder
};
module.exports = builder;
"use strict";
const { QueryBuilder, builder } = require("./builder.js");
const { QueryBatcher, batcher } = require("./batcher.js");
const builder = require("./builder.js");
const batcher = require("./batcher.js");
const factory = require("./factory.js");
module.exports = {
QueryBuilder,
let graphqlQueryFactory = {
builder,
QueryBatcher,
batcher
};
batcher,
factory
};
module.exports = graphqlQueryFactory;
"use strict";
const { QueryBatcher, batcher } = require("../batcher.js");
const batcher = require("../batcher.js");
const mock = require("./_mock.js");
const test = require("ava");

@@ -8,115 +9,18 @@ const chalk = require("chalk");

const sampleQueries = [`mutation {
createContent(
markup: "markupA"
raw: "rawA"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupB"
raw: "rawB"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupC"
raw: "rawC"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupD"
raw: "rawD"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupE"
raw: "rawE"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupF"
raw: "rawF"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupE"
raw: "rawE"
) {
markup
raw
}
}`];
// let batchQueryReturnComparison = `[ { createContent: { markup: 'markupA', raw: 'rawA' } },
// { createContent: { markup: 'markupB', raw: 'rawB' } },
// { createContent: { markup: 'markupC', raw: 'rawC' } },
// { createContent: { markup: 'markupD', raw: 'rawD' } },
// { createContent: { markup: 'markupE', raw: 'rawE' } },
// { createContent: { markup: 'markupF', raw: 'rawF' } },
// { createContent: { markup: 'markupG', raw: 'rawG' } } ]`;
const expectedSlice = [`mutation {
createContent(
markup: "markupA"
raw: "rawA"
) {
markup
raw
}
}`, `mutation {
createContent(
markup: "markupB"
raw: "rawB"
) {
markup
raw
}
}`];
const singleQuery = `mutation {
createContent(
markup: "markup1"
raw: "raw1"
) {
markup
raw
}
}`;
let createContentData = `{"createContent":{"markup":"markup1","raw":"raw1","__typename":"Content"}}`;
test("slice query array", t => {
let q = new QueryBatcher(sampleQueries, 2);
let sliced = q.sliceQueryArray();
let target = sliced.target;
t.is(String(target), String(expectedSlice));
});
test("execute single query", async t => {
let q = new QueryBatcher();
let res = await q.queryExecute(singleQuery);
let endpoint = String(process && process.env && process.env.GQL_SIMPLE_ENDPOINT || "https://api.graph.cool/simple/v1/cj7rzel6x02b40143fhkupzik");
let token = String(process && process.env && process.env.GQL_AUTH_TOKEN || "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MDU4NDkxNTIsImNsaWVudElkIjoiY2oxYzRqZ3Axa2lwdzAxMDV4MDVmZTRuNSIsInByb2plY3RJZCI6ImNqN3J6ZWw2eDAyYjQwMTQzZmhrdXB6aWsiLCJwZXJtYW5lbnRBdXRoVG9rZW5JZCI6ImNqN3J6cGVidDAyeTQwMTU1cG9odnllNGgifQ.ZA2zNCIvzrkUrASxkuZbX26rvHfsbKHK2V53J5CwQi4");
t.is(createContentData, JSON.stringify(res.data));
let res = await batcher.request(mock.singleQuery);
t.is(mock.singleReturn, JSON.stringify(res));
});
test("execute two types of queries <query> && <mutation>", async t => {
//TODO
t.pass();
});
test("execute four queries concurrently", async t => {
//TODO
let q = new QueryBatcher(sampleQueries);
let res = q.queryBatchExecute();
t.pass();
});
//
test("execute batch of queries", async t => {
let res = await batcher.batch(mock.batchQuery);
t.pass(mock.batchReturn, JSON.stringify(res));
});
"use strict";
const { builder } = require("../builder.js");
const test = require("ava");
const builder = require("../builder.js");
const mock = require("./_mock.js");
const chalk = require("chalk");
const log = console.log;
const sampleMutation = `mutation {
createContent(
markup: $markup
raw: $raw
) {
markup
raw
}
}`;
const queryVariablesArray = [{
markup: "markup1",
raw: "raw1"
}, {
markup: "markup2",
raw: "raw2"
}, {
markup: "markup3",
raw: "raw3"
}];
const expectedQueries = `mutation {
createContent(
markup: markup1
raw: raw1
) {
markup
raw
}
},mutation {
createContent(
markup: markup2
raw: raw2
) {
markup
raw
}
},mutation {
createContent(
markup: markup3
raw: raw3
) {
markup
raw
}
}`;
test("queries build", async t => {
let qs = await builder(sampleMutation, queryVariablesArray);
let queries = String(qs);
// log(`${chalk.grey(queries)}`);
t.is(queries, expectedQueries);
test("queries build", t => {
let queries = builder(mock.template, mock.variables);
t.is(String(queries), String(mock.batchQuery));
});
{
"name": "graphql-query-factory",
"version": "1.0.19",
"version": "1.0.20",
"description": "",
"main": "dist/index.js",
"scripts": {
"start": "npm run dev",
"dev": "npm run build && npm test",

@@ -28,6 +29,3 @@ "build": "babel src --out-dir dist",

"dependencies": {
"apollo-client": "^1.9.2",
"dotenv": "^4.0.0",
"graphql-tag": "^2.4.2",
"node-fetch": "^1.7.3"
"graphql-request": "^1.3.6"
},

@@ -42,4 +40,5 @@ "devDependencies": {

"chalk": "^2.1.0",
"dotenv": "^4.0.0",
"flow-bin": "^0.54.1"
}
}

@@ -5,20 +5,11 @@ # GraphQL Query Batcher

## Status
> * QueryBuilder available.
> * QueryBatcher is close.
> * Broke sample into its own repo: [graphql-query-factory-test](https://github.com/alechp/graphql-query-factory-test)
> * Fixed some breaking changes in last version that prevented module from being used. This was a result of main pointing to /index instead of src/index. Should be fixed now.
### Roadmap
| Status | Summary | Comment |
|:-------|:---------|:--------|
| ☐ | QueryFactory | Combines Builder & Batcher |
| ✓ | QueryBuilder | Builds individual query strings based on the number of variable combinations you have. |
| ☐ | QueryBatcher | Executes the entire array of GraphQL Query Strings. |
| ✓ | Ava | |
| ☐ | Flow | Dependencies added but not finished |
| ✓ | Babel | |
| ✓ | TravisCI | [https://travis-ci.org/alechp/graphql-query-factory](https://travis-ci.org/alechp/graphql-query-factory)|
| ☐ | Webpack | Babel has been useful for testing. Going to convert to webpack to enable uglification, tree-shaking, etc. |
* `factory` included as of 1.20.0 (shim around builder and batcher)
* `batcher` included as of 1.20.0 (executes array of queries)
* `builder` updated (this builds query strings from query/mutation and variables)
### Action Items (Micro)
You can see TODOs in [todo.md](./docs/todo.md)
## Getting Started
#### Installation
### Installation
```bash

@@ -28,85 +19,69 @@ npm install graphql-query-factory -S

#### Sample Use
QueryFactory
```js
Not available yet
```
### Examples
> All of these examples can be seen at [graphql-query-factory-test](https://github.com/alechp/graphql-query-factory-test)
All mock variables (e.g. "mock.template", "mock.variables") can be viewed here: [.../tests/_mock.js](https://github.com/alechp/graphql-query-factory/blob/master/src/tests/_mock.js)
--------------------------------
##### QueryBuilder - [Sample Project](https://github.com/alechp/graphql-query-factory/tree/master/graphql-query-factory-test-project)
#### builder
```js
const { builder } = require('graphql-query-factory');
const log = console.log;
const mutationTemplate = `mutation {
createContent(
markup: $markup
raw: $raw
) {
markup
raw
}
}`;
let queries = builder(mock.template, mock.variables);
log(`builder(mock.template, mock.variables): ${queries}`);
```
const mutationVariables = [
{
"markup": "markup1",
"raw": "raw1"
},
{
"markup": "markup2",
"raw": "raw2"
},
{
"markup": "markup3",
"raw": "raw3"
}
];
> NOTE: async version has been replaced here with sync version.
> Will be adding async version of builder in future along with a stream. See [todo.md](./docs/todo.md) for details.
let queries = builder(mutationTemplate, mutationVariables);
--------------------------------
#### factory
```js
const { factory } = require('graphql-query-factory');
factory(mock.template, mock.variables)
.then(data =>
log(
`factory(mock.template, mock.variables): ${JSON.stringify(data, null, 4)}`
)
)
.catch(err => log(`factory(mock.template, mock.variables): ${err}`));
```
QueryBuilder Output:
```graphql
mutation {
createContent(
markup: markup1
raw: raw1
) {
markup
raw
}
}
mutation {
createContent(
markup: markup2
raw: raw2
) {
markup
raw
}
}
mutation {
createContent(
markup: markup3
raw: raw3
) {
markup
raw
}
}
```
--------------------------------
QueryBatcher
#### batcher
```js
Not available yet
const { batcher } = require('graphql-query-factory');
batcher
.request(mock.singleQuery)
.then(data => log(`batcher.request(mock.singleQuery): ${(data, null, 4)}`))
.catch(err => log(`batcher.request(mock.singleQuery): ${err}`));
```
--------------------------------
#### Environment Variables
#### Visual of data being saved to GraphQL database
![graphcool](./docs/graphcool_data_saved.png)
When using `QueryBatcher()` or `batcher` you must include two environment variables:
##### Configuration (Environment Variables)
When using `factory` or `batcher` you must include two environment variables:
* `GQL_SIMPLE_ENDPOINT`
* `GQL_AUTH_TOKEN`
If you don't already have a method for this, you can:
```
1. Create .env file in your root directory
2. npm install dotenv -S
3. add require('dotenv').config() at entry point (i.e. index/main) of your project
4. define variables like so:
GQL_SIMPLE_ENDPOINT=http://api.endpoint.goes.here/12345
GQL_AUTH_TOKEN=longobscuretoken
^ note that there's no quotation marks
```
//@flow
const fetch = require("node-fetch");
global.fetch = fetch;
const { ApolloClient, createNetworkInterface } = require("apollo-client");
const gql = require("graphql-tag");
const { GraphQLClient, request } = require("graphql-request");
const chalk = require("chalk");
const log = console.log;
function batcher(queries: Array<string>, concurrent: number = 4): mixed {
let batcherHandle = new QueryBatcher(queries, concurrent);
let executedBatchPromise = batcherHandle.queryBatchExecute();
return executedBatchPromise;
}
class QueryBatcher {
queries: Array<string>;
concurrent: number;
constructor(queries, concurrent = 4) {
this.queries = queries;
this.concurrent = concurrent;
const client = new GraphQLClient(process.env.GQL_SIMPLE_ENDPOINT, {
headers: {
Authorization: `Bearer ${process.env.GQL_AUTH_TOKEN}`
}
getQueries() {
return this.queries;
}
setQueries(arrayOfQueryStrings: Array<string>) {
this.queries = arrayOfQueryStrings;
}
getConcurrent() {
return this.concurrent;
}
setConcurrent(numberOfConcurrentConnections: number) {
this.concurrent = numberOfConcurrentConnections;
}
async queryBatchExecute(): mixed {
let queries = this.getQueries();
let concurrent = this.getConcurrent();
let sliced = this.sliceQueryArray(queries, concurrent);
let res = Promise.all(sliced.target.map(this.queryExecute));
return res;
}
});
async queryExecute(query: string): mixed {
const client = new ApolloClient({
networkInterface: createNetworkInterface({
uri: process.env.GQL_SIMPLE_ENDPOINT,
opts: {
headers: { Authorization: process.env.GQL_AUTH_TOKEN }
}
function queryExecute(query: string): mixed {
return new Promise((resolve, reject) => {
request(process.env.GQL_SIMPLE_ENDPOINT, query)
.then(data => {
resolve(data);
})
});
try {
return await client.mutate({ mutation: gql`${query}` });
} catch (error) {
log(
`\n${chalk.red(
"queryExecute() in " + this.constructor.name + " failed."
)} ${chalk.red(error)}\n`
);
}
}
sliceQueryArray(): mixed {
let original: Array<string> = this.getQueries();
let concurrent: number = this.getConcurrent();
let target: Array<string> = original.slice(0, concurrent);
original = original.slice(concurrent, original.length);
// log(`${chalk.green('\nTarget\n---------------------------------\n')} ${target.toString()}`);
// log(`${chalk.green('\nOriginal\n---------------------------------\n')} ${original.toString()}`);
let queries = {
target: [...target],
original: [...original]
};
return queries;
}
.catch(err => {
log(err.response.errors);
log(err.response.data);
reject(err);
});
});
}
module.exports = {
batcher,
QueryBatcher
function queryExecuteBatch(arrayOfQueries) {
let resp = Promise.all(arrayOfQueries.map(query => queryExecute(query)));
return resp;
}
let batcher = {
request: queryExecute,
batch: queryExecuteBatch
};
module.exports = batcher;
//@flow
const chalk = require("chalk"); //https://www.npmjs.com/package/chalk
const gql = require("graphql-tag");
const log = console.log;

@@ -56,3 +54,2 @@

let regex = /\$\w+/g;
// let regex = /\$\w+(?=[\):])/g;
let queryParams = query.match(regex);

@@ -85,3 +82,3 @@ if (queryParams !== null) {

inc++;
return inc == 1 ? value : match;
return inc == 1 ? `"${value}"` : match;
});

@@ -96,3 +93,3 @@ query = queryNew;

buildQueries() {
buildQueries(): Array<string> {
let q: string = this.getQuery();

@@ -114,5 +111,2 @@ let v: mixed = this.getVariables();

module.exports = {
QueryBuilder,
builder
};
module.exports = builder;

@@ -1,9 +0,10 @@

const { QueryBuilder, builder } = require("./builder.js");
const { QueryBatcher, batcher } = require("./batcher.js");
const builder = require("./builder.js");
const batcher = require("./batcher.js");
const factory = require("./factory.js");
module.exports = {
QueryBuilder,
let graphqlQueryFactory = {
builder,
QueryBatcher,
batcher
batcher,
factory
};
module.exports = graphqlQueryFactory;

@@ -1,2 +0,3 @@

const { QueryBatcher, batcher } = require("../batcher.js");
const batcher = require("../batcher.js");
const mock = require("./_mock.js");
const test = require("ava");

@@ -6,126 +7,18 @@ const chalk = require("chalk");

const sampleQueries = [
`mutation {
createContent(
markup: "markupA"
raw: "rawA"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupB"
raw: "rawB"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupC"
raw: "rawC"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupD"
raw: "rawD"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupE"
raw: "rawE"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupF"
raw: "rawF"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupE"
raw: "rawE"
) {
markup
raw
}
}`
];
// let batchQueryReturnComparison = `[ { createContent: { markup: 'markupA', raw: 'rawA' } },
// { createContent: { markup: 'markupB', raw: 'rawB' } },
// { createContent: { markup: 'markupC', raw: 'rawC' } },
// { createContent: { markup: 'markupD', raw: 'rawD' } },
// { createContent: { markup: 'markupE', raw: 'rawE' } },
// { createContent: { markup: 'markupF', raw: 'rawF' } },
// { createContent: { markup: 'markupG', raw: 'rawG' } } ]`;
const expectedSlice = [
`mutation {
createContent(
markup: "markupA"
raw: "rawA"
) {
markup
raw
}
}`,
`mutation {
createContent(
markup: "markupB"
raw: "rawB"
) {
markup
raw
}
}`
];
const singleQuery = `mutation {
createContent(
markup: "markup1"
raw: "raw1"
) {
markup
raw
}
}`;
let createContentData = `{"createContent":{"markup":"markup1","raw":"raw1","__typename":"Content"}}`;
test("slice query array", t => {
let q = new QueryBatcher(sampleQueries, 2);
let sliced = q.sliceQueryArray();
let target = sliced.target;
t.is(String(target), String(expectedSlice));
});
test("execute single query", async t => {
let q = new QueryBatcher();
let res = await q.queryExecute(singleQuery);
let endpoint: string = String(process.env.GQL_SIMPLE_ENDPOINT);
let token: string = String(process.env.GQL_AUTH_TOKEN);
t.is(createContentData, JSON.stringify(res.data));
let res = await batcher.request(mock.singleQuery);
t.is(mock.singleReturn, JSON.stringify(res));
});
test("execute two types of queries <query> && <mutation>", async t => {
//TODO
t.pass();
test("execute batch of queries", async t => {
let res = await batcher.batch(mock.batchQuery);
t.pass(mock.batchReturn, JSON.stringify(res));
});
test("execute four queries concurrently", async t => {
//TODO
let q = new QueryBatcher(sampleQueries);
let res = q.queryBatchExecute();
t.pass();
});
//

@@ -1,62 +0,10 @@

const { builder } = require("../builder.js");
const test = require("ava");
const builder = require("../builder.js");
const mock = require("./_mock.js");
const chalk = require("chalk");
const log = console.log;
const sampleMutation = `mutation {
createContent(
markup: $markup
raw: $raw
) {
markup
raw
}
}`;
const queryVariablesArray = [
{
markup: "markup1",
raw: "raw1"
},
{
markup: "markup2",
raw: "raw2"
},
{
markup: "markup3",
raw: "raw3"
}
];
const expectedQueries = `mutation {
createContent(
markup: markup1
raw: raw1
) {
markup
raw
}
},mutation {
createContent(
markup: markup2
raw: raw2
) {
markup
raw
}
},mutation {
createContent(
markup: markup3
raw: raw3
) {
markup
raw
}
}`;
test("queries build", async t => {
let qs = await builder(sampleMutation, queryVariablesArray);
let queries = String(qs);
// log(`${chalk.grey(queries)}`);
t.is(queries, expectedQueries);
test("queries build", t => {
let queries = builder(mock.template, mock.variables);
t.is(String(queries), String(mock.batchQuery));
});
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc