diff --git a/packages/contract-cli/package.json b/packages/contract-cli/package.json index ab8951e094664033af8322d97ee0d383e557a700..b9127ffaf29c00b43d308e63924ee316bb90f2d9 100755 --- a/packages/contract-cli/package.json +++ b/packages/contract-cli/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-contract", - "version": "1.7.19", + "version": "1.7.20", "description": "JS API / command line tool to generate the contract.json for jsonql", "main": "index.js", "files": [ diff --git a/packages/contract-cli/src/generator/get-resolver.js b/packages/contract-cli/src/generator/get-resolver.js index 3a67ed1fbb0d4f7a72a8087bdd64d2ad74175887..78e52283b79f15f5f23cf97b8d3342d02ddbef14 100644 --- a/packages/contract-cli/src/generator/get-resolver.js +++ b/packages/contract-cli/src/generator/get-resolver.js @@ -122,15 +122,16 @@ const checkResolver = (indexFile, inDir, fileType, config) => (baseFile) => { /** * filter to get which is resolver or not - * @param {string} inDir the base path - * @param {string} fileType ext * @param {object} config options to use + * @param {string} fileType ext * @return {function} work out if it's or not */ -function getResolver(inDir, fileType, config) { +function getResolver(config, fileType) { const indexFile = [INDEX_KEY, fileType].join('.') // return a function here - return checkResolver(indexFile, inDir, fileType, config) + const fn = checkResolver(indexFile, config.resolverDir, fileType, config) + debug(fn.toString()) + return fn; } /** @@ -149,7 +150,6 @@ function processResolverToContract(type, name, file, public, namespace, sourceTy const source = fsx.readFileSync(file, 'utf8').toString() // parsing the file const result = astParser(source, { sourceType }) - // logToFile(config.logDirectory, [type, name].join('-'), result) // get params @BUG the error happens here? const baseParams = result.body.filter(isExpression).map(extractParams).filter(p => p) diff --git a/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js index 3cb30fb6742ef2b165e8205f0199cf17ee4268f9..8ecb8f8740b1db6b0e3e792d82948e6b991a6143 100644 --- a/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js +++ b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js @@ -7,11 +7,11 @@ const { getResolver } = require('../get-resolver') * @param {string} payload.file the argument pass to the processor * @return {void} just use process.send back the idx, processor and result */ -process.on('message', ({file, inDir, fileType, config}) => { - const preprocessor = getResolver(inDir, fileType, config) - Reflect.apply(preprocessor, null, [file]) - .then(result => { - // send the result straight back - process.send(result) - }) +process.on('message', ({file, config, fileType}) => { + const fn = getResolver(config, fileType) + fn(file) + .then(result => { + // send the result straight back + process.send(result) + }) }) diff --git a/packages/contract-cli/src/generator/index.js b/packages/contract-cli/src/generator/index.js index 3bc41c1fc0f429996b2bd80d58ee6ffe76ee8f59..6d6afb0dcc011d95155967b9ccbcf31f6b1b6599 100644 --- a/packages/contract-cli/src/generator/index.js +++ b/packages/contract-cli/src/generator/index.js @@ -10,7 +10,7 @@ const { merge } = require('lodash') const colors = require('colors/safe') const debug = require('debug')('jsonql-contract:generator') -const { EXT, PUBLIC_CONTRACT_FILE_NAME } = require('jsonql-constants') +const { PUBLIC_CONTRACT_FILE_NAME } = require('jsonql-constants') const { publicContractGenerator } = require('../public-contract') const { readFilesOutContract } = require('./read-files-out-contract') @@ -59,8 +59,8 @@ const callPublicGenerator = (config, contract) => ( * @return {mixed} depends on the returnAs parameter */ const generateNewContract = (config) => { - const { resolverDir, contractDir } = config; - return readFilesOutContract(resolverDir, config, config.ext || EXT) + // const { resolverDir, contractDir } = config; + return readFilesOutContract(config) .then(([sourceType, contract]) => { if (config.public === true) { // we can get the sourceType from the contract diff --git a/packages/contract-cli/src/generator/process-file.js b/packages/contract-cli/src/generator/process-file.js index 6f5335b13dd88c89aa192c8efad7d8a19384b2b1..71af7531eeb1c77559448211fd37603854493958 100644 --- a/packages/contract-cli/src/generator/process-file.js +++ b/packages/contract-cli/src/generator/process-file.js @@ -7,33 +7,10 @@ const { getContractBase, processResolverToContract } = require('./get-resolver') -const { splitTask } = require('./split-task') -// const { logToFile } = require('./helpers') -// const { astParser, extractReturns, extractParams, isExpression, getJsdoc } = require('../ast') const { getDebug } = require('../utils') const debug = getDebug('process-file') // this was lost when using as api using let -/** - * wrapper method to call the pre splitTask - * - */ -function callPreSplitTask(inDir, fileType, files, config) { - return splitTask('pre', { inDir, fileType, files, config }) -} - -/** - * wrapper method to call the process splitTask - * - */ -function callPostSplitTask(_sourceType, _files, _config) { - return splitTask('process', { - sourceType: _sourceType, - files: _files, - config: _config - }) -} - /** * Take the map filter out to get the clean resolver objects * @param {array} _files files to process @@ -41,27 +18,23 @@ function callPostSplitTask(_sourceType, _files, _config) { * @return {array} resolver objects */ function processFilesAction(inDir, fileType, files, config) { - return callPreSplitTask(inDir, fileType, files, config) - .then(result => { - if (result === false) { - const preprocessor = getResolver(inDir, fileType, config) - return files.map( preprocessor ) - .filter( obj => obj.ok ) - .reduce( (n, m) => [...n, m], []) // do we need this? - } - return result; - }) + const preprocessor = getResolver(config, fileType) + return Promise.resolve( + files.map( preprocessor ) + .filter( obj => obj.ok ) + ) + // .reduce( (n, m) => [...n, m], []) } /** * This is the step one to parallel process the resolver file + * @param {array} files to process * @param {string} inDir where the resolverDir is * @param {string} fileType extension to expect - * @param {array} _files to process * @param {object} config options * @return {array} of preprocessed filtered resolver */ -function preprocessResolverFile(inDir, fileType, files, config) { +function preprocessResolverFile(files, inDir, fileType, config) { return processFilesAction(inDir, fileType, files, config) .then(objs => [ getSourceType(objs), @@ -73,19 +46,18 @@ function preprocessResolverFile(inDir, fileType, files, config) { * process the files * @param {string} inDir base directory * @param {string} fileType the ext - * @param {array} _files list of files + * @param {array} files list of files * @param {object} config to control the inner working * @return {object} promise that resolve all the files key query / mutation */ -function processResolverFile(sourceType, _files, config) { - return callPostSplitTask(sourceType, _files, config) - .then(result => ( - result || _files - .map(({ type, name, file, public, namespace }) => ( - processResolverToContract(type, name, file, public, namespace, resourceType) - )) - .reduce(merge, getContractBase(sourceType)) - )) +function processResolverFile(sourceType, files, config) { + return Promise.resolve( + files + .map(({ type, name, file, public, namespace }) => ( + processResolverToContract(type, name, file, public, namespace, resourceType) + )) + .reduce(merge, getContractBase(sourceType)) + ) } /** diff --git a/packages/contract-cli/src/generator/read-files-out-contract.js b/packages/contract-cli/src/generator/read-files-out-contract.js index e9bc12817246818e7a4c5c70cbe1049b16b1f0b7..4423f702f496aaa70291e7ba5dcb1f7878220f6b 100644 --- a/packages/contract-cli/src/generator/read-files-out-contract.js +++ b/packages/contract-cli/src/generator/read-files-out-contract.js @@ -15,12 +15,12 @@ const debug = getDebug('read-files-out-contract') /** * just return the list of files for process - * @param {string} inDir the path to the resolver directory + * @param {string} resolverDir the path to the resolver directory * @param {string} [fileType=EXT] the file extension * @return {promise} resolve the files array on success or reject with error */ -function getResolverFiles(inDir, fileType = EXT) { - const pat = join(inDir, '**', ['*', fileType].join('.')) +function getResolverFiles(resolverDir, fileType) { + const pat = join(resolverDir, '**', ['*', fileType].join('.')) return new Promise((resolver, rejecter) => { glob(pat, (err, files) => { if (err) { @@ -34,21 +34,22 @@ function getResolverFiles(inDir, fileType = EXT) { /** * get list of files and put them in query / mutation - * @param {string} inDir diretory * @param {object} config pass config to the underlying method - * @param {mixed} fileType we might do a ts in the future * @return {object} query / mutation */ -function readFilesOutContract(inDir, config, fileType) { +function readFilesOutContract(config) { + const { resolverDir } = config; + let fileType = config.ext || EXT; let timestart = Date.now() - return getResolverFiles(inDir, fileType) - .then(_files => ( - preprocessResolverFile(inDir, fileType, _files, config) - )) - .then(result => { - const [sourceType, files] = result; - return processResolverFile(sourceType, files, config) - .then(contract => [sourceType, contract]) + + return getResolverFiles(resolverDir, fileType) + .then(_files => { + return preprocessResolverFile(_files, resolverDir, fileType, config) + .then(result => { + const [sourceType, files] = result; + return processResolverFile(sourceType, files, config) + .then(contract => [sourceType, contract]) + }) }) .then(result => { let timeend = Date.now() - timestart @@ -58,6 +59,6 @@ function readFilesOutContract(inDir, config, fileType) { } module.exports = { - getResolverFiles, // export for testing + getResolverFiles, readFilesOutContract } diff --git a/packages/contract-cli/src/generator/split-task.js b/packages/contract-cli/src/generator/split-task.js index 0f0d258efea3d12b49fb3918c96a411c8f493e75..59524c232ca3c4bf64839080827769c249bb0359 100644 --- a/packages/contract-cli/src/generator/split-task.js +++ b/packages/contract-cli/src/generator/split-task.js @@ -25,6 +25,9 @@ function getSlots() { */ function executeTask(taskPath, payload) { const ps = fork(join(basePath, `${taskPath}.js`)) + + debug(payload.idx, payload) + return new Promise((resolver, rejecter) => { ps.send( payload ) ps.on('message', result => { @@ -71,7 +74,7 @@ function createTask(slots, taskPath, payloads, returnType = true) { * @return {promise} resolve the final result */ function splitTask(taskName, payload) { - // disable this for now @TODO + return Promise.resolve(false) const slots = getSlots() @@ -94,18 +97,16 @@ function splitTask(taskName, payload) { break; case 'pre': returnType = false; // default is array - scriptName = 'preprocess-resolver' + scriptName = 'preprocess-resolver'; // here we need to get a preprocessor, then we don't need to keep calling it // can not send a function as arument to the fork fn let { inDir, fileType, files } = payload; // debug(preprocessor, files) - payloads = files.map(file => ({ file, inDir, fileType, config: payload.config })) + payloads = files.map((file, idx) => ({ file, inDir, fileType, idx, config: payload.config })) postProcessor = result => { // should be running the fitler here - // return result.filter(obj => obj.ok) debug('postProcessor', result) - // run the filter here - return result; + return result.filter(obj => obj.ok) } break; default: diff --git a/packages/contract-cli/src/utils.js b/packages/contract-cli/src/utils.js index 71322c6c658b301889c16481e30d2687f64f199f..2ce632b774c0a300965f53dbe8ca54c7ba438141 100644 --- a/packages/contract-cli/src/utils.js +++ b/packages/contract-cli/src/utils.js @@ -16,8 +16,6 @@ const MODULE_NAME = 'jsonql-contract' const getTimestamp = () => timestamp(true) const getDebug = (name) => debug(MODULE_NAME).extend(name) - - /** * check if there is a config file and use that value instead * @param {object} opts transformed diff --git a/packages/contract-cli/tests/split-task.test.js b/packages/contract-cli/tests/split-task.test.js index cb620b7036b4057ca64d8ac7348c1b865067921d..ee69038eace72ec449c6cada6d0909a369c97fe7 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 { chainPromises } = require('jsonql-utils') const os = require('os') const debug = require('debug')('jsonql-contract:test:split') +const { EXT } = require('jsonql-constants') + // import method frr testing const { getResolverFiles } = require('../src/generator/read-files-out-contract') const { splitTask } = require('../src/generator/split-task') +const { applyDefaultOptions } = require('../src') const { getResolver, getSourceType, @@ -40,7 +43,7 @@ test.before(t => { t.context.taskes = taskes }) -test.cb(`Should able to create multple array based on the cpu available`, t => { +test.cb(`Should able to create multiple array based on the cpu available`, t => { t.plan(1) debug(`available task slot is ${t.context.ctn}`) @@ -73,13 +76,32 @@ test.cb(`Should able to create multple array based on the cpu available`, t => { }) }) -test.cb(`It should able to split the task and return an array`, t => { - t.plan(1) - // need to get a config object - getResolverFiles(resolverDir) - .then(files => { - // prepare the payloads - t.truthy(files.length) - t.end() - }) +test.cb.skip(`It should able to split the task and return an array`, t => { + t.plan(2) + + applyDefaultOptions({ + resolverDir + }) + .then(config => { + return getResolverFiles(resolverDir) + .then(files => { + // prepare the payloads + t.truthy(files.length) + const payload = { + files, + config, + inDir: 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() + }) + }) + + + })