diff --git a/packages/contract-cli/extra.js b/packages/contract-cli/extra.js index 3037529ee7b43eaedfebf1ebe9773cb40328dc9a..edde258a042c0d46eaaf3a4262bba6c0d5d1dfdc 100644 --- a/packages/contract-cli/extra.js +++ b/packages/contract-cli/extra.js @@ -3,6 +3,8 @@ // so make this available in different places const fsx = require('fs-extra') const { join } = require('path') +const nbSplitTasks = require('nb-split-tasks') + const contractApi = require('./index') const { DEFAULT_CONTRACT_FILE_NAME, PUBLIC_CONTRACT_FILE_NAME } = require('jsonql-constants') @@ -42,8 +44,25 @@ const contractGenerator = function(opts, pub = false, start = false) { }) } +/** + * Export a new function that will call the split.js file + * and run the call in the another process + * @param {object} config configuration + * @param {boolean} [pub=false] default private contract, true for public + * @return {promise} resolve the contract + */ +const splitContractGenerator = function(config, pub = false) { + const pathToFn = join(__dirname, 'split.js') + const args = [config, pub] + const returnType = config.returnAs === 'json' ? 'object' : 'array' + return nbSplitTasks(pathToFn, [args], returnType) + .then(contract => returnType === 'array' ? contract[0] : contract) +} + + // export module.exports = { contractGenerator, - readContract + readContract, + splitContractGenerator } diff --git a/packages/contract-cli/package.json b/packages/contract-cli/package.json index 6a401d9baaeeb81a6635cb3dce23a37934447d56..9c383f6297d872723565bf3e87676bf031196a0a 100755 --- a/packages/contract-cli/package.json +++ b/packages/contract-cli/package.json @@ -1,13 +1,14 @@ { "name": "jsonql-contract", - "version": "1.8.2", + "version": "1.8.3", "description": "JS API / command line tool to generate the contract.json for jsonql", "main": "index.js", "files": [ "src", "cli.js", "index.js", - "extra.js" + "extra.js", + "split.js" ], "scripts": { "dev": "DEBUG=jsonql-contract:* node ./test.js", diff --git a/packages/contract-cli/split.js b/packages/contract-cli/split.js new file mode 100644 index 0000000000000000000000000000000000000000..301fbd3b2fbe5698fcd565b3645dfaf3336cfdb8 --- /dev/null +++ b/packages/contract-cli/split.js @@ -0,0 +1,26 @@ +// try to create a self reference split-task file +const { contractGenerator, readContract } = require('./extra') + +/** + * For split task to import this method + * @param {object} config configuration + * @param {boolean} pub public or not + * @return {promise} resolve the contract + */ +module.exports = function splitGetContract(config, pub) { + return new Promise((resolver, rejecter) => { + if (config) { + let contract = readContract(config.contractDir, pub) + if (contract !== false) { + return resolver(contract) + } + contractGenerator(config, pub) + .then(contract => { + resolver(contract) + }) + .catch(error => { + rejecter(error) + }) + } + }) +} diff --git a/packages/contract-cli/tests/split-task.test.js b/packages/contract-cli/tests/split-task.test.js index 4678a1735a344a436babc23486de6e83632b6aef..e1363dc366c67dcb082d78c332ad4b36c5b50ffa 100644 --- a/packages/contract-cli/tests/split-task.test.js +++ b/packages/contract-cli/tests/split-task.test.js @@ -5,9 +5,12 @@ const { join } = require('path') const debug = require('debug')('jsonql-contract:test:split') const { EXT } = require('jsonql-constants') const nbSplitTasks = require('nb-split-tasks') +const fsx = require('fs-extra') // import method frr testing const { getResolverFiles } = require('../src/generator/read-files-out-contract') const { splitTask } = require('../src/generator/split-task') +const { splitContractGenerator } = require('../extra') + const { applyDefaultOptions } = require('../src') const { getResolver, @@ -16,50 +19,52 @@ const { } = require('../src/generator/get-resolver') const resolverDir = join(__dirname, 'fixtures', 'koa-resolvers') +const contractDir = join(__dirname, 'tmp', 'split-test') test.before(t => { - + fsx.removeSync(contractDir) }) -test.cb.skip(`First test the splitTask in a different environment`, t => { - t.plan(1) - const pathToFn = join(__dirname, '..', 'src', 'generator', 'sub', 'test.js') - let args = []; - for (let i=0; i<10; ++i) { - args.push([{idx: i+1}]) - } - - nbSplitTasks(pathToFn, args, 'array') - .then(result => { - t.true(Array.isArray(result)) - t.end() - }) +test.after(t=> { + fsx.removeSync(contractDir) }) test.cb(`It should able to split the task and return an array`, t => { t.plan(2) - applyDefaultOptions({ - resolverDir - }) - .then(config => { - return getResolverFiles(resolverDir, EXT) - .then(files => { - // prepare the payloads - t.truthy(files.length) - // create payload for task - const payload = { - files, - config, - resolverDir, // we should take this option out later - fileType: EXT // this also should be taken out - } - return splitTask('pre', payload) - }) - .then(result => { - debug(result) - t.pass() - t.end() + applyDefaultOptions({ resolverDir }) + .then(config => { + return getResolverFiles(resolverDir, EXT) + .then(files => { + // prepare the payloads + t.truthy(files.length) + // create payload for task + const payload = { + files, + config, + resolverDir, // we should take this option out later + fileType: EXT // this also should be taken out + } + return splitTask('pre', payload) + }) + .then(result => { + debug(result) + t.pass() + t.end() + }) }) +}) + +test.only(`It should able to call a self reference splitContractGenerator`, async t => { + const contract = await splitContractGenerator({ + resolverDir, + contractDir, + returnAs: 'json' }) + + // debug(contract) + t.pass() + // if return as is NOT json then it will be the path to the json + // t.true(fsx.existsSync(join(contractDir, 'contract.json'))) + }) diff --git a/packages/koa/contract.js b/packages/koa/contract.js index 2bf5d0755d44f8bd9142cc29212159b5780aa2b1..d05b99e76eb5e960d2cdfc62aeee7e803e99487e 100644 --- a/packages/koa/contract.js +++ b/packages/koa/contract.js @@ -1,8 +1,8 @@ // @1.1.4 We move the contract generator to the top level // so you could do import generator from 'jsonql-koa/contract' // and pre-generate the contract to supply both the koa / ws setup -const { configCheck } = require('./src'); -const contractApi = require('jsonql-contract'); +const { configCheck } = require('./src') +const contractApi = require('jsonql-contract') /** * Wrap this in a promise @@ -28,5 +28,5 @@ module.exports = function(config, pub = false) { resolverDir, enableAuth }) - ); -}; + ) +} diff --git a/packages/node-client/package.json b/packages/node-client/package.json index 25c9e7e69c9f5237bbe5c4bfad9a209f4be2c6df..fd53c816461431bda10f6ebb2fc83d14e721d67a 100755 --- a/packages/node-client/package.json +++ b/packages/node-client/package.json @@ -55,7 +55,7 @@ }, "devDependencies": { "ava": "^2.4.0", - "jsonql-contract": "^1.8.1", + "jsonql-contract": "^1.8.2", "jsonql-koa": "^1.4.0", "jsonql-ws-server": "^1.3.5", "nyc": "^14.1.1", diff --git a/packages/node-client/tests/jwt.test.js b/packages/node-client/tests/jwt.test.js index f834295646bc1bee24a9fc97accc2cade9d14e00..1ed43f4afebba97bf2a27e413535064dbe821fbd 100644 --- a/packages/node-client/tests/jwt.test.js +++ b/packages/node-client/tests/jwt.test.js @@ -13,6 +13,9 @@ const port = 8890; const username = 'joel'; test.before(async t => { + // make sure the folder is clean + fsx.removeSync(contractDir) + const { stop } = await server(port, { contractDir, keysDir,