diff --git a/packages/contract-cli/extra.js b/packages/contract-cli/extra.js new file mode 100644 index 0000000000000000000000000000000000000000..0e0d1fd8c902ca21f98c98874e66693546a638a9 --- /dev/null +++ b/packages/contract-cli/extra.js @@ -0,0 +1,52 @@ +// ported from jsonql-koa for testing +// this need to get call from the beginning +// so make this available in different places +const fsx = require('fs-extra') +const { join } = require('path') +const contractApi = require('./index') +const { + DEFAULT_CONTRACT_FILE_NAME, + PUBLIC_CONTRACT_FILE_NAME +} = require('jsonql-constants') + +const debug = require('debug')('jsonql-contract:contract-generator') +/** + * @param {string} contractDir where the contract is + * @param {boolean} pub system of public + * @return {mixed} false on not found + */ +const readContract = function(contractDir, pub) { + const file = join(contractDir, pub ? PUBLIC_CONTRACT_FILE_NAME : DEFAULT_CONTRACT_FILE_NAME) + if (fsx.existsSync(file)) { + debug('Serving up the existing one from ', file) + return fsx.readJsonSync(file) + } + return false; +} + +/** + * contract create handler + * @param {object} opts options + * @param {boolean} pub where to serve this + * @param {boolean} start is this the first call + * @return {object} promise to resolve contract json + */ +const contractGenerator = function(opts, pub = false, start = false) { + return new Promise((resolver, rejecter) => { + if (opts.buildContractOnStart === false && start === false) { + const contract = readContract(opts.contractDir, pub) + if (contract !== false) { + return resolver(contract) + } + } + contractApi(Object.assign({}, opts, { public: pub })) + .then(resolver) + .catch(rejecter) + }) +} + +// export +module.exports = { + contractGenerator, + readContract +} diff --git a/packages/contract-cli/package.json b/packages/contract-cli/package.json index 1ac575fdfa917dedfdcc282281687baffbf4a96c..f0a3946d5bb2576fb20894a08cf975763fe864ab 100755 --- a/packages/contract-cli/package.json +++ b/packages/contract-cli/package.json @@ -1,17 +1,18 @@ { "name": "jsonql-contract", - "version": "1.7.13", + "version": "1.7.14", "description": "JS API / command line tool to generate the contract.json for jsonql", "main": "index.js", "files": [ "src", "cli.js", - "index.js" + "index.js", + "extra.js" ], "scripts": { "dev": "DEBUG=jsonql-contract:* node ./test.js", "coverage": "nyc ava --verbose", - "prepare": "npm run test", + "prepare": "ava --verbose", "cli": "DEBUG=jsonql-contract* node ./cli.js", "cli:watch": "DEBUG=jsonql-contract* node ./watch.js", "test:cli": "npm run cli configFile ./tests/fixtures/cmd-config-test.js", diff --git a/packages/contract-cli/src/options.js b/packages/contract-cli/src/options.js index 9b2316231c20d5ee2c526dc0354eb002da3cca4f..fb894415fbc5764526d3293cbe805bc5cc166d9a 100644 --- a/packages/contract-cli/src/options.js +++ b/packages/contract-cli/src/options.js @@ -53,7 +53,7 @@ const defaultOptions = { resolverDir: createConfig(resolve(join(BASE_DIR, DEFAULT_RESOLVER_DIR)) , STRING_TYPE, {[ALIAS_KEY]: 'inDir'}), contractDir: createConfig(resolve(join(BASE_DIR, DEFAULT_CONTRACT_DIR)), STRING_TYPE, {[ALIAS_KEY]: 'outDir'}), // show or hide the description field in the public contract - // contractWithDesc: createConfig(false, [BOOLEAN_TYPE]), @1.7.6 move to Koa + // contractWithDesc: createConfig(false, [BOOLEAN_TYPE]), @1.7.6 move to Koa // remove the old one and always create a new one - useful during development alwaysNew: createConfig(false, [BOOLEAN_TYPE]), // where to put the public method @@ -68,7 +68,9 @@ const defaultOptions = { configFile: createConfig(false, [STRING_TYPE], {[OPTIONAL_KEY]: true, [ALIAS_KEY]: 'c'}), announceUrl: createConfig(false, [STRING_TYPE], {[OPTIONAL_KEY]: true, [ALIAS_KEY]: 'a'}), logDirectory: constructConfig(false, [STRING_TYPE], true), - tmpDir: createConfig(join(BASE_DIR, 'tmp'), [STRING_TYPE]) + tmpDir: createConfig(join(BASE_DIR, 'tmp'), [STRING_TYPE]), + // ported from jsonql-koa + buildContractOnStart: constructConfig(false, [BOOLEAN_TYPE], true) } // export it module.exports = config => checkConfigAsync(config, defaultOptions, constProps) diff --git a/packages/contract-cli/tests/koa-debug.test.js b/packages/contract-cli/tests/koa-debug.test.js index de0885fe54a59fb7974b31f9bff0a3e84eca9ca7..81305157a526ad82f9dc6c3ff2d4bdfdce48cd31 100644 --- a/packages/contract-cli/tests/koa-debug.test.js +++ b/packages/contract-cli/tests/koa-debug.test.js @@ -1,10 +1,11 @@ // this resolvers cause an error with the updateMsService resolver when call from within jsonql-koa const test = require('ava') const { join } = require('path') +const { inspect } = require('util') const fsx = require('fs-extra') const debug = require('debug')('jsonql-contract:koa-debugging') -const generator = require('../index') +const { contractGenerator } = require('../extra') const resolverDir = join(__dirname, 'fixtures', 'koa-resolvers') const contractDir = join(__dirname, 'tmp', 'koa-debug') @@ -14,13 +15,13 @@ test.after(t => { }) test(`It should able to generate a contract without error`, async t => { - const result = await generator({ + const result = await contractGenerator({ resolverDir, contractDir, returnAs: 'json' }) - debug('%O', result) + debug(inspect(result, false, null)) t.truthy(result.query) })