graphql-query-factory
Advanced tools
Comparing version 1.0.19 to 1.0.20
"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" | ||
} | ||
} |
141
readme.md
@@ -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 | ||
 | ||
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)); | ||
}); |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
135647
1
28
10
1
9
729
86
+ Addedgraphql-request@^1.3.6
+ Addedcross-fetch@2.2.2(transitive)
+ Addedgraphql-request@1.8.2(transitive)
+ Addednode-fetch@2.1.2(transitive)
- Removedapollo-client@^1.9.2
- Removeddotenv@^4.0.0
- Removedgraphql-tag@^2.4.2
- Removednode-fetch@^1.7.3
- Removed@types/graphql@0.10.2(transitive)
- Removedapollo-client@1.9.3(transitive)
- Removedapollo-link-core@0.5.4(transitive)
- Removeddotenv@4.0.0(transitive)
- Removedencoding@0.1.13(transitive)
- Removedgraphql@0.10.5(transitive)
- Removedgraphql-anywhere@3.1.0(transitive)
- Removedgraphql-tag@2.12.6(transitive)
- Removediconv-lite@0.6.3(transitive)
- Removedis-stream@1.1.0(transitive)
- Removediterall@1.3.0(transitive)
- Removedjs-tokens@4.0.0(transitive)
- Removedlodash@4.17.21(transitive)
- Removedlodash-es@4.17.21(transitive)
- Removedloose-envify@1.4.0(transitive)
- Removednode-fetch@1.7.3(transitive)
- Removedredux@3.7.2(transitive)
- Removedsafer-buffer@2.1.2(transitive)
- Removedsymbol-observable@1.2.0(transitive)
- Removedtslib@2.8.1(transitive)
- Removedzen-observable-ts@0.4.4(transitive)