From bb2c9e4245480412d8d8019d9a48af17dc0cacbe Mon Sep 17 00:00:00 2001 From: Joelchu Date: Thu, 15 Aug 2019 21:08:18 +0800 Subject: [PATCH 01/21] move rx-client into @jsonql --- packages/{rx-client => @jsonql/rx}/README.md | 0 .../{rx-client => @jsonql/rx}/package.json | 0 .../rx}/rollup.config.js | 0 .../rx}/src/base-client.js | 0 .../rx}/src/fetch-class.js | 0 .../rx}/src/generator.js | 0 .../{rx-client => @jsonql/rx}/src/index.js | 0 .../rx}/src/lib/validator/index.js | 0 .../rx}/src/lib/validator/src/any.js | 0 .../rx}/src/lib/validator/src/array.js | 0 .../rx}/src/lib/validator/src/boolean.js | 0 .../src/lib/validator/src/check-options.js | 0 .../rx}/src/lib/validator/src/combine.js | 0 .../rx}/src/lib/validator/src/constants.js | 0 .../src/lib/validator/src/construct-config.js | 0 .../rx}/src/lib/validator/src/debug.js | 0 .../lib/validator/src/errors/checker-error.js | 0 .../lib/validator/src/errors/enum-error.js | 0 .../rx}/src/lib/validator/src/errors/index.js | 0 .../lib/validator/src/errors/type-error.js | 0 .../rx}/src/lib/validator/src/index.js | 0 .../rx}/src/lib/validator/src/not-empty.js | 0 .../rx}/src/lib/validator/src/number.js | 0 .../rx}/src/lib/validator/src/object.js | 0 .../src/options/check-options-async.js | 0 .../src/options/check-options-sync.js | 0 .../validator/src/options/construct-config.js | 0 .../src/lib/validator/src/options/index.js | 0 .../src/lib/validator/src/options/utils.js | 0 .../rx}/src/lib/validator/src/string.js | 0 .../rx}/src/lib/validator/src/validator.js | 0 .../{rx-client => @jsonql/rx}/src/options.js | 0 .../rx}/src/rx-client.js | 0 .../rx}/src/socket-client-generator.js | 0 packages/koa-ts/README.md | 3 - packages/koa-ts/client.ts | 0 packages/koa-ts/index.ts | 0 packages/koa-ts/package.json | 75 --------- packages/koa-ts/rollup.config.js | 8 - packages/koa-ts/src/auth.ts | 0 packages/koa-ts/src/client.ts | 0 packages/koa-ts/src/contract.ts | 0 packages/koa-ts/src/core.ts | 0 packages/koa-ts/src/hello.ts | 0 packages/koa-ts/src/index.ts | 7 - packages/koa-ts/src/lib/index.ts | 31 ---- packages/koa-ts/src/lib/search.ts | 0 packages/koa-ts/src/lib/utils.ts | 153 ------------------ packages/koa-ts/tests/utils.test.ts | 23 --- packages/koa-ts/tsconfig.json | 12 -- 50 files changed, 312 deletions(-) rename packages/{rx-client => @jsonql/rx}/README.md (100%) rename packages/{rx-client => @jsonql/rx}/package.json (100%) rename packages/{rx-client => @jsonql/rx}/rollup.config.js (100%) rename packages/{rx-client => @jsonql/rx}/src/base-client.js (100%) rename packages/{rx-client => @jsonql/rx}/src/fetch-class.js (100%) rename packages/{rx-client => @jsonql/rx}/src/generator.js (100%) rename packages/{rx-client => @jsonql/rx}/src/index.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/index.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/any.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/array.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/boolean.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/check-options.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/combine.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/constants.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/construct-config.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/debug.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/errors/checker-error.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/errors/enum-error.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/errors/index.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/errors/type-error.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/index.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/not-empty.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/number.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/object.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/options/check-options-async.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/options/check-options-sync.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/options/construct-config.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/options/index.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/options/utils.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/string.js (100%) rename packages/{rx-client => @jsonql/rx}/src/lib/validator/src/validator.js (100%) rename packages/{rx-client => @jsonql/rx}/src/options.js (100%) rename packages/{rx-client => @jsonql/rx}/src/rx-client.js (100%) rename packages/{rx-client => @jsonql/rx}/src/socket-client-generator.js (100%) delete mode 100644 packages/koa-ts/README.md delete mode 100644 packages/koa-ts/client.ts delete mode 100644 packages/koa-ts/index.ts delete mode 100644 packages/koa-ts/package.json delete mode 100644 packages/koa-ts/rollup.config.js delete mode 100644 packages/koa-ts/src/auth.ts delete mode 100644 packages/koa-ts/src/client.ts delete mode 100644 packages/koa-ts/src/contract.ts delete mode 100644 packages/koa-ts/src/core.ts delete mode 100644 packages/koa-ts/src/hello.ts delete mode 100644 packages/koa-ts/src/index.ts delete mode 100644 packages/koa-ts/src/lib/index.ts delete mode 100644 packages/koa-ts/src/lib/search.ts delete mode 100644 packages/koa-ts/src/lib/utils.ts delete mode 100644 packages/koa-ts/tests/utils.test.ts delete mode 100644 packages/koa-ts/tsconfig.json diff --git a/packages/rx-client/README.md b/packages/@jsonql/rx/README.md similarity index 100% rename from packages/rx-client/README.md rename to packages/@jsonql/rx/README.md diff --git a/packages/rx-client/package.json b/packages/@jsonql/rx/package.json similarity index 100% rename from packages/rx-client/package.json rename to packages/@jsonql/rx/package.json diff --git a/packages/rx-client/rollup.config.js b/packages/@jsonql/rx/rollup.config.js similarity index 100% rename from packages/rx-client/rollup.config.js rename to packages/@jsonql/rx/rollup.config.js diff --git a/packages/rx-client/src/base-client.js b/packages/@jsonql/rx/src/base-client.js similarity index 100% rename from packages/rx-client/src/base-client.js rename to packages/@jsonql/rx/src/base-client.js diff --git a/packages/rx-client/src/fetch-class.js b/packages/@jsonql/rx/src/fetch-class.js similarity index 100% rename from packages/rx-client/src/fetch-class.js rename to packages/@jsonql/rx/src/fetch-class.js diff --git a/packages/rx-client/src/generator.js b/packages/@jsonql/rx/src/generator.js similarity index 100% rename from packages/rx-client/src/generator.js rename to packages/@jsonql/rx/src/generator.js diff --git a/packages/rx-client/src/index.js b/packages/@jsonql/rx/src/index.js similarity index 100% rename from packages/rx-client/src/index.js rename to packages/@jsonql/rx/src/index.js diff --git a/packages/rx-client/src/lib/validator/index.js b/packages/@jsonql/rx/src/lib/validator/index.js similarity index 100% rename from packages/rx-client/src/lib/validator/index.js rename to packages/@jsonql/rx/src/lib/validator/index.js diff --git a/packages/rx-client/src/lib/validator/src/any.js b/packages/@jsonql/rx/src/lib/validator/src/any.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/any.js rename to packages/@jsonql/rx/src/lib/validator/src/any.js diff --git a/packages/rx-client/src/lib/validator/src/array.js b/packages/@jsonql/rx/src/lib/validator/src/array.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/array.js rename to packages/@jsonql/rx/src/lib/validator/src/array.js diff --git a/packages/rx-client/src/lib/validator/src/boolean.js b/packages/@jsonql/rx/src/lib/validator/src/boolean.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/boolean.js rename to packages/@jsonql/rx/src/lib/validator/src/boolean.js diff --git a/packages/rx-client/src/lib/validator/src/check-options.js b/packages/@jsonql/rx/src/lib/validator/src/check-options.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/check-options.js rename to packages/@jsonql/rx/src/lib/validator/src/check-options.js diff --git a/packages/rx-client/src/lib/validator/src/combine.js b/packages/@jsonql/rx/src/lib/validator/src/combine.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/combine.js rename to packages/@jsonql/rx/src/lib/validator/src/combine.js diff --git a/packages/rx-client/src/lib/validator/src/constants.js b/packages/@jsonql/rx/src/lib/validator/src/constants.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/constants.js rename to packages/@jsonql/rx/src/lib/validator/src/constants.js diff --git a/packages/rx-client/src/lib/validator/src/construct-config.js b/packages/@jsonql/rx/src/lib/validator/src/construct-config.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/construct-config.js rename to packages/@jsonql/rx/src/lib/validator/src/construct-config.js diff --git a/packages/rx-client/src/lib/validator/src/debug.js b/packages/@jsonql/rx/src/lib/validator/src/debug.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/debug.js rename to packages/@jsonql/rx/src/lib/validator/src/debug.js diff --git a/packages/rx-client/src/lib/validator/src/errors/checker-error.js b/packages/@jsonql/rx/src/lib/validator/src/errors/checker-error.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/errors/checker-error.js rename to packages/@jsonql/rx/src/lib/validator/src/errors/checker-error.js diff --git a/packages/rx-client/src/lib/validator/src/errors/enum-error.js b/packages/@jsonql/rx/src/lib/validator/src/errors/enum-error.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/errors/enum-error.js rename to packages/@jsonql/rx/src/lib/validator/src/errors/enum-error.js diff --git a/packages/rx-client/src/lib/validator/src/errors/index.js b/packages/@jsonql/rx/src/lib/validator/src/errors/index.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/errors/index.js rename to packages/@jsonql/rx/src/lib/validator/src/errors/index.js diff --git a/packages/rx-client/src/lib/validator/src/errors/type-error.js b/packages/@jsonql/rx/src/lib/validator/src/errors/type-error.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/errors/type-error.js rename to packages/@jsonql/rx/src/lib/validator/src/errors/type-error.js diff --git a/packages/rx-client/src/lib/validator/src/index.js b/packages/@jsonql/rx/src/lib/validator/src/index.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/index.js rename to packages/@jsonql/rx/src/lib/validator/src/index.js diff --git a/packages/rx-client/src/lib/validator/src/not-empty.js b/packages/@jsonql/rx/src/lib/validator/src/not-empty.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/not-empty.js rename to packages/@jsonql/rx/src/lib/validator/src/not-empty.js diff --git a/packages/rx-client/src/lib/validator/src/number.js b/packages/@jsonql/rx/src/lib/validator/src/number.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/number.js rename to packages/@jsonql/rx/src/lib/validator/src/number.js diff --git a/packages/rx-client/src/lib/validator/src/object.js b/packages/@jsonql/rx/src/lib/validator/src/object.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/object.js rename to packages/@jsonql/rx/src/lib/validator/src/object.js diff --git a/packages/rx-client/src/lib/validator/src/options/check-options-async.js b/packages/@jsonql/rx/src/lib/validator/src/options/check-options-async.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/options/check-options-async.js rename to packages/@jsonql/rx/src/lib/validator/src/options/check-options-async.js diff --git a/packages/rx-client/src/lib/validator/src/options/check-options-sync.js b/packages/@jsonql/rx/src/lib/validator/src/options/check-options-sync.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/options/check-options-sync.js rename to packages/@jsonql/rx/src/lib/validator/src/options/check-options-sync.js diff --git a/packages/rx-client/src/lib/validator/src/options/construct-config.js b/packages/@jsonql/rx/src/lib/validator/src/options/construct-config.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/options/construct-config.js rename to packages/@jsonql/rx/src/lib/validator/src/options/construct-config.js diff --git a/packages/rx-client/src/lib/validator/src/options/index.js b/packages/@jsonql/rx/src/lib/validator/src/options/index.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/options/index.js rename to packages/@jsonql/rx/src/lib/validator/src/options/index.js diff --git a/packages/rx-client/src/lib/validator/src/options/utils.js b/packages/@jsonql/rx/src/lib/validator/src/options/utils.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/options/utils.js rename to packages/@jsonql/rx/src/lib/validator/src/options/utils.js diff --git a/packages/rx-client/src/lib/validator/src/string.js b/packages/@jsonql/rx/src/lib/validator/src/string.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/string.js rename to packages/@jsonql/rx/src/lib/validator/src/string.js diff --git a/packages/rx-client/src/lib/validator/src/validator.js b/packages/@jsonql/rx/src/lib/validator/src/validator.js similarity index 100% rename from packages/rx-client/src/lib/validator/src/validator.js rename to packages/@jsonql/rx/src/lib/validator/src/validator.js diff --git a/packages/rx-client/src/options.js b/packages/@jsonql/rx/src/options.js similarity index 100% rename from packages/rx-client/src/options.js rename to packages/@jsonql/rx/src/options.js diff --git a/packages/rx-client/src/rx-client.js b/packages/@jsonql/rx/src/rx-client.js similarity index 100% rename from packages/rx-client/src/rx-client.js rename to packages/@jsonql/rx/src/rx-client.js diff --git a/packages/rx-client/src/socket-client-generator.js b/packages/@jsonql/rx/src/socket-client-generator.js similarity index 100% rename from packages/rx-client/src/socket-client-generator.js rename to packages/@jsonql/rx/src/socket-client-generator.js diff --git a/packages/koa-ts/README.md b/packages/koa-ts/README.md deleted file mode 100644 index 61fbf29e..00000000 --- a/packages/koa-ts/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ~~jsonql Koa middleware using Typescript~~ - -This project will no longer continue, instead we develop a Deno.js port using Typescript diff --git a/packages/koa-ts/client.ts b/packages/koa-ts/client.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/index.ts b/packages/koa-ts/index.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/package.json b/packages/koa-ts/package.json deleted file mode 100644 index 095757ab..00000000 --- a/packages/koa-ts/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "jsonql-koa-ts", - "version": "0.0.1", - "description": "jsonql Koa middleware using Typescript", - "main": "index.ts", - "scripts": { - "test": "nyc ava", - "dev": "rollup -w", - "build": "rollup" - }, - "keywords": [ - "Typescript", - "Koa", - "Node.js", - "jsonql" - ], - "author": "NEWBRAN LTD ", - "license": "MIT", - "dependencies": { - "fs-extra": "^7.0.1", - "jsonql-constants": "^1.2.1", - "koa": "^2.7.0", - "koa-bodyparser": "^4.2.1", - "koa-compose": "^4.1.0", - "koa-json": "^2.0.2", - "koa-logger": "^3.2.0", - "koa-router": "^7.4.0", - "lodash-es": "^4.17.11", - "lodash.merge": "^4.6.1", - "lodash.trim": "^4.5.1" - }, - "devDependencies": { - "@types/koa": "^2.0.48", - "@types/koa-bodyparser": "^4.2.2", - "@types/koa-json": "^2.0.18", - "@types/koa-logger": "^3.1.1", - "@types/koa-router": "^7.0.40", - "@types/lodash-es": "^4.17.3", - "@types/lodash.merge": "^4.6.6", - "@types/lodash.trim": "^4.5.6", - "@types/node": "^11.13.0", - "ava": "^1.4.1", - "debug": "^4.1.1", - "nyc": "^13.3.0", - "rollup": "^1.9.0", - "rollup-plugin-typescript": "^1.0.1", - "superkoa": "^1.0.3", - "ts-node": "^8.0.3", - "tslib": "^1.9.3", - "typescript": "^3.4.2" - }, - "ava": { - "files": [ - "tests/*.test.ts", - "!tests/helpers/*.*", - "!tests/fixtures/*.*" - ], - "cache": true, - "concurrency": 5, - "failFast": true, - "failWithoutAssertions": false, - "tap": false, - "compileEnhancements": false, - "extensions": [ - "ts" - ], - "require": [ - "ts-node/register" - ] - }, - "repository": { - "type": "git", - "url": "git+ssh://git@gitee.com:to1source/jsonql.git" - } -} diff --git a/packages/koa-ts/rollup.config.js b/packages/koa-ts/rollup.config.js deleted file mode 100644 index 6e0332ad..00000000 --- a/packages/koa-ts/rollup.config.js +++ /dev/null @@ -1,8 +0,0 @@ -import typescript from 'rollup-plugin-typescript'; - -export default { - input: 'src/index.ts', - plugins: [ - typescript() - ] -} diff --git a/packages/koa-ts/src/auth.ts b/packages/koa-ts/src/auth.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/src/client.ts b/packages/koa-ts/src/client.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/src/contract.ts b/packages/koa-ts/src/contract.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/src/core.ts b/packages/koa-ts/src/core.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/src/hello.ts b/packages/koa-ts/src/hello.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/src/index.ts b/packages/koa-ts/src/index.ts deleted file mode 100644 index 8ec9fbe6..00000000 --- a/packages/koa-ts/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -// top level exports -export * from './lib/options.ts'; -export * from './auth.ts'; -export * from './core.ts'; -export * from './contract.ts'; -export * from './hello.ts'; -export * from './client.ts'; diff --git a/packages/koa-ts/src/lib/index.ts b/packages/koa-ts/src/lib/index.ts deleted file mode 100644 index 0e9e1ee8..00000000 --- a/packages/koa-ts/src/lib/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - headerParser, - getDocLen, - packError, - packResult, - printError, - isJsonqlRequest, - getCallMethod, - isHeaderPresent -} from './utils'; -import getFunction from './search'; -import { contractFn, readContract } from './contract'; -import ResolverNotFoundError from './resolver-not-found-error'; -import ResolverApplicationError from './resolver-application-error'; -// export -export { - headerParser, - getDocLen, - packError, - packResult, - printError, - // individual import - getFunction, - isJsonqlRequest, - getCallMethod, - isHeaderPresent, - contractFn, - readContract, - ResolverNotFoundError, - ResolverApplicationError -}; diff --git a/packages/koa-ts/src/lib/search.ts b/packages/koa-ts/src/lib/search.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/koa-ts/src/lib/utils.ts b/packages/koa-ts/src/lib/utils.ts deleted file mode 100644 index a31e953b..00000000 --- a/packages/koa-ts/src/lib/utils.ts +++ /dev/null @@ -1,153 +0,0 @@ -// util libraries -import * as fs from 'fs'; -import { join } from 'path'; -import { inspect } from 'util'; - -/** - * From underscore.string library - * @BUG if it's not a camel case such as FileToDash - * it will return -file-to-dash (with the extra - at the beginning) - * @param {string} str string - * @return {string} dasherize string - */ -export const dasherize = function(str: string): string { - return str.trim() - .replace(/([A-Z])/g, '-$1') - .replace(/[-_\s]+/g, '-') - .toLowerCase(); -}; - -/** - * Get document (string) byte length for use in header - * @param {string} doc to calculate - * @return {number} length - */ -export const getDocLen = function(doc: string): number { - return Buffer.byteLength(doc, 'utf8'); -}; - -/** - * The koa ctx object is not returning what it said on the documentation - * So I need to write a custom parser to check the request content-type - * @param {object} req the ctx.request - * @param {string} type (optional) to check against - * @return {mixed} Array or Boolean (cheat to use any type for now) - */ -export const headerParser = function(req: any, type?: string): any { - try { - const headers = req.headers.accept.split(','); - return type ? headers.filter(h => h === type) - : headers; - } catch (e) { - // When Chrome dev tool activate the headers become empty - return []; - } -}; - -/** - * wrapper of above method to make it easier to use - * @param {object} req ctx.request - * @param {string} type of header - * @return {boolean} - */ -export const isHeaderPresent = function(req: any, type: string): boolean { - const headers = headerParser(req, type); - return !!headers.length; -}; - -/** - * combine two check in one and save time - * @param {object} ctx koa - * @param {object} opts config - * @return {boolean} check result - */ -export const isJsonqlRequest = function(ctx: any, opts: any): boolean { - const header = isHeaderPresent(ctx.request, opts.contentType); - return header ? ctx.path === opts.jsonqlPath : false; -} - -/** - * getting what is calling after the above check - * @param {string} method of call - * @return {mixed} false on failed - */ -export const getCallMethod = function(method: string): string|boolean { - switch (method) { - case 'POST': - return 'query'; - case 'PUT': - return 'mutation'; - default: - return false; - } -} - -/** - * @param {string} name - * @param {string} type - * @param {object} opts - * @return {function} on success || boolean false on fail - */ -export const getPathToFn = function(name: string, type: string, opts: any): any { - const dir = opts.resolverDir; - const fileName = dasherize(name); - let paths = []; - if (opts.contract && opts.contract[type] && opts.contract[type].path) { - paths.push(opts.contract[type].path); - } - paths.push( join(dir, type, fileName, 'index.ts') ); - paths.push( join(dir, type, fileName + '.ts') ); - const ctn = paths.length; - for (let i=0; i { - t.is(await dasherize('fileToDash'), 'file-to-dash'); -}); - -test('Testing getDocLen', async t => { - t.truthy(await getDocLen('Just a test')); -}); diff --git a/packages/koa-ts/tsconfig.json b/packages/koa-ts/tsconfig.json deleted file mode 100644 index 77980066..00000000 --- a/packages/koa-ts/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./dist", - "lib": ["es5", "es6"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true - }, - "include": ["./src/**/*"] -} -- Gitee From 5fbe02324533eba40ac7f07c2da7e234447f8204 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Thu, 15 Aug 2019 21:11:47 +0800 Subject: [PATCH 02/21] add express middleware folder --- packages/express/package.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/express/package.json diff --git a/packages/express/package.json b/packages/express/package.json new file mode 100644 index 00000000..6c5947be --- /dev/null +++ b/packages/express/package.json @@ -0,0 +1,16 @@ +{ + "name": "jsonql-express", + "version": "0.0.1", + "description": "jsonql express middleware", + "main": "index.js", + "scripts": { + "test": "ava" + }, + "keywords": [ + "jsonql", + "express", + "node" + ], + "author": "Joel Chu ", + "license": "ISC" +} -- Gitee From 9b323871fcc1ba2aeca1c48af5e361b312335576 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Thu, 15 Aug 2019 22:08:17 +0800 Subject: [PATCH 03/21] moving the client related methods from koa to resolver --- packages/koa/index.js | 1 - packages/koa/package.json | 3 +- packages/koa/src/index.js | 4 +-- packages/resolver/package.json | 4 ++- .../{koa => resolver}/src/client-generator.js | 0 packages/{koa => resolver/src}/client.js | 32 +++++++++++++++++++ packages/resolver/src/node-client-setup.js | 10 ++++++ 7 files changed, 48 insertions(+), 6 deletions(-) rename packages/{koa => resolver}/src/client-generator.js (100%) rename packages/{koa => resolver/src}/client.js (48%) create mode 100644 packages/resolver/src/node-client-setup.js diff --git a/packages/koa/index.js b/packages/koa/index.js index 24a2cc26..a02666e6 100755 --- a/packages/koa/index.js +++ b/packages/koa/index.js @@ -12,7 +12,6 @@ const { authMiddleware, contractMiddleware, helloMiddleware, - clientGenerator, consoleMiddleware, publicMethodMiddleware, errorsHandlerMiddleware, diff --git a/packages/koa/package.json b/packages/koa/package.json index 6957c709..71fe3dba 100755 --- a/packages/koa/package.json +++ b/packages/koa/package.json @@ -1,12 +1,11 @@ { "name": "jsonql-koa", - "version": "1.3.7", + "version": "1.3.8", "description": "jsonql Koa middleware", "main": "index.js", "files": [ "src", "index.js", - "client.js", "contract.js" ], "scripts": { diff --git a/packages/koa/src/index.js b/packages/koa/src/index.js index 91f95d30..ef7bdf98 100755 --- a/packages/koa/src/index.js +++ b/packages/koa/src/index.js @@ -4,7 +4,7 @@ const authMiddleware = require('./auth-middleware') const coreMiddleware = require('./core-middleware') const contractMiddleware = require('./contract-middleware') const helloMiddleware = require('./hello-middleware') -const clientGenerator = require('./client-generator') + const consoleMiddleware = require('./console-middleware') const publicMethodMiddleware = require('./public-method-middleware') @@ -20,7 +20,7 @@ module.exports = { coreMiddleware, contractMiddleware, helloMiddleware, - clientGenerator, + publicMethodMiddleware, errorsHandlerMiddleware, initMiddleware diff --git a/packages/resolver/package.json b/packages/resolver/package.json index 45b0d743..f9ee3e1b 100644 --- a/packages/resolver/package.json +++ b/packages/resolver/package.json @@ -21,7 +21,9 @@ "jsonql-constants": "^1.7.9", "jsonql-errors": "^1.1.1", "jsonql-jwt": "^1.2.5", - "jsonql-params-validator": "^1.4.3" + "jsonql-node-client": "^1.1.4", + "jsonql-params-validator": "^1.4.3", + "lodash.merge": "^4.6.2" }, "devDependencies": { "ava": "^2.2.0", diff --git a/packages/koa/src/client-generator.js b/packages/resolver/src/client-generator.js similarity index 100% rename from packages/koa/src/client-generator.js rename to packages/resolver/src/client-generator.js diff --git a/packages/koa/client.js b/packages/resolver/src/client.js similarity index 48% rename from packages/koa/client.js rename to packages/resolver/src/client.js index 93b4925e..aa75bddf 100755 --- a/packages/koa/client.js +++ b/packages/resolver/src/client.js @@ -5,6 +5,38 @@ const merge = require('lodash.merge') const debug = require('debug')('jsonql-koa:client') const jsonqlNodeClient = require('jsonql-node-client') + + +/** + * Double check if the client config is correct or not also we could inject some of the properties here + * @param {object} config configuration + * @return {object} with additional properties + */ +const validateClientConfig = function(config) { + let ctn = config.clientConfig.length + if (ctn) { + let names = [] + let clients = [] + for (let i = 0; i < ctn; ++i) { + let client = config.clientConfig[i] + if (!client.hostname) { + throw new Error(`Missing hostname in client config ${i}`) + } + if (!client.name) { + client.name = `nodeClient${i}` + } + if (inArray(client.name, names)) { + throw new Error(`[${i}] ${client.name} already existed, can not have duplicated!`) + } + names.push(client.name) + clients.push(client) + } + config.clientConfig = clients; + } + return config; +} + + /** * This is for the resolvers to include and get their node-client * @param {string} name this client - it get automatically generate if the user didn't provide one diff --git a/packages/resolver/src/node-client-setup.js b/packages/resolver/src/node-client-setup.js new file mode 100644 index 00000000..be84af8a --- /dev/null +++ b/packages/resolver/src/node-client-setup.js @@ -0,0 +1,10 @@ +const nodeClient = require('jsonql-node-client') + +function injectClients(resolver, clients) { + + Object.defineProperty(resolver, 'clients', { + value: clients, + writable: false // make this immutatble + }) + return resolver +} -- Gitee From a644c090d5aca9c14084a7ceb805405f395b6155 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Thu, 15 Aug 2019 22:11:30 +0800 Subject: [PATCH 04/21] remove the check node client config this will move to resolver instead --- packages/koa/src/lib/config-check/index.js | 31 +--------------------- 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/packages/koa/src/lib/config-check/index.js b/packages/koa/src/lib/config-check/index.js index 9570e25d..f166f154 100644 --- a/packages/koa/src/lib/config-check/index.js +++ b/packages/koa/src/lib/config-check/index.js @@ -9,35 +9,6 @@ const { getContract, isContractJson, chainFns, getDebug, inArray } = require('.. const debug = getDebug('config-check') -/** - * Double check if the client config is correct or not also we could inject some of the properties here - * @param {object} config configuration - * @return {object} with additional properties - */ -const validateClientConfig = function(config) { - let ctn = config.clientConfig.length - if (ctn) { - let names = [] - let clients = [] - for (let i = 0; i < ctn; ++i) { - let client = config.clientConfig[i] - if (!client.hostname) { - throw new Error(`Missing hostname in client config ${i}`) - } - if (!client.name) { - client.name = `nodeClient${i}` - } - if (inArray(client.name, names)) { - throw new Error(`[${i}] ${client.name} already existed, can not have duplicated!`) - } - names.push(client.name) - clients.push(client) - } - config.clientConfig = clients; - } - return config; -} - /** * break out from the applyAuthOptions because it's not suppose to be there * @param {object} config configuration @@ -93,6 +64,6 @@ const applyAuthOptions = function(config) { * @api public */ module.exports = function configCheck(config) { - const fn = chainFns(checkConfig, validateClientConfig, applyGetContract, applyAuthOptions) + const fn = chainFns(checkConfig, applyGetContract, applyAuthOptions) return fn(config, appProps, constProps) } -- Gitee From 965b3239643b3f0ed35449835c71091e18867f3b Mon Sep 17 00:00:00 2001 From: Joelchu Date: Thu, 15 Aug 2019 22:50:41 +0800 Subject: [PATCH 05/21] move all the client methods in its own folder --- .../resolver/src/{ => client}/client-generator.js | 0 packages/resolver/src/{ => client}/client.js | 0 .../resolver/src/{ => client}/node-client-setup.js | 14 +++++++++----- 3 files changed, 9 insertions(+), 5 deletions(-) rename packages/resolver/src/{ => client}/client-generator.js (100%) rename packages/resolver/src/{ => client}/client.js (100%) rename packages/resolver/src/{ => client}/node-client-setup.js (36%) diff --git a/packages/resolver/src/client-generator.js b/packages/resolver/src/client/client-generator.js similarity index 100% rename from packages/resolver/src/client-generator.js rename to packages/resolver/src/client/client-generator.js diff --git a/packages/resolver/src/client.js b/packages/resolver/src/client/client.js similarity index 100% rename from packages/resolver/src/client.js rename to packages/resolver/src/client/client.js diff --git a/packages/resolver/src/node-client-setup.js b/packages/resolver/src/client/node-client-setup.js similarity index 36% rename from packages/resolver/src/node-client-setup.js rename to packages/resolver/src/client/node-client-setup.js index be84af8a..08585741 100644 --- a/packages/resolver/src/node-client-setup.js +++ b/packages/resolver/src/client/node-client-setup.js @@ -1,10 +1,14 @@ const nodeClient = require('jsonql-node-client') -function injectClients(resolver, clients) { - Object.defineProperty(resolver, 'clients', { - value: clients, - writable: false // make this immutatble - }) + + +function injectClients(resolver, clients) { + if (Object.getOwnPropertyDescriptor(fn, 'clients') === undefined) { + Object.defineProperty(resolver, 'clients', { + value: clients, + writable: false // make this immutatble + }) + } return resolver } -- Gitee From 583c7c05353c33383a440ae08f55a53d8d2105ab Mon Sep 17 00:00:00 2001 From: Joelchu Date: Thu, 15 Aug 2019 23:20:45 +0800 Subject: [PATCH 06/21] setup all the basic implementation --- .../resolver/src/client/client-generator.js | 47 ------------------- .../resolver/src/client/clients-generator.js | 11 +++++ packages/resolver/src/client/index.js | 9 ++++ ...client-setup.js => inject-node-clients.js} | 5 +- .../{client.js => validate-client-config.js} | 35 +++----------- packages/resolver/src/provide-node-clients.js | 32 +++++++++++++ packages/resolver/src/resolve-methods.js | 5 ++ 7 files changed, 64 insertions(+), 80 deletions(-) delete mode 100755 packages/resolver/src/client/client-generator.js create mode 100755 packages/resolver/src/client/clients-generator.js create mode 100755 packages/resolver/src/client/index.js rename packages/resolver/src/client/{node-client-setup.js => inject-node-clients.js} (69%) rename packages/resolver/src/client/{client.js => validate-client-config.js} (47%) mode change 100755 => 100644 create mode 100644 packages/resolver/src/provide-node-clients.js diff --git a/packages/resolver/src/client/client-generator.js b/packages/resolver/src/client/client-generator.js deleted file mode 100755 index cbadf720..00000000 --- a/packages/resolver/src/client/client-generator.js +++ /dev/null @@ -1,47 +0,0 @@ -const { join } = require('path') -const fs = require('fs') -const fsx = require('fs-extra') -const contractApi = require('jsonql-contract') -const debug = require('debug')('jsonql-koa:clientGenerator') -const { CLIENT_CONFIG_FILE } = require('jsonql-constants') -// const config = require('config'); - -// @TODO move this to the node-client instead - -/** - * this will construct the client for resolvers to use - * The idea is simple we pass the client config to the node-client - * it generate the contract files, and when the developer need to call it - * just simply include the ./client using the name and it will locate it for them - * @param {object} opts the full configuration - * @return {undefined} nothing - */ -module.exports = function(opts) { - let clientConfig = []; - let clientLocalConfig = {}; - const nodeClient = opts.nodeClient; - const contractDir = opts.contractDir; - for (let name in nodeClient) { - if (nodeClient.hostname) { - let obj = {}; - obj.remote = nodeClient.hostname; - if (nodeClient.contractKey) { - obj.remote = '?' + (nodeClient.contractKeyName || opts.contractKeyName) + '=' + opts.contractKey; - } - let cdir = join(contractDir, name); - obj.out = cdir; - clientConfig.push(obj); - // this is for keeping a record - clientLocalConfig[name] = { - contractDir: cdir, - hostname: nodeClient.hostname - }; - } else { - debug(`${name} node client is missing hostname! skipped`) - } - } - return Promise.all(clientopts.map(contractApi)).then(contracts => { - // create a .clients.json in the contract folder - fsx.outputJsonSync(join(process.cwd(), CLIENT_CONFIG_FILE), clientLocalConfig) - }); -} diff --git a/packages/resolver/src/client/clients-generator.js b/packages/resolver/src/client/clients-generator.js new file mode 100755 index 00000000..4183330c --- /dev/null +++ b/packages/resolver/src/client/clients-generator.js @@ -0,0 +1,11 @@ +const jsonqlNodeClient = require('jsonql-node-client') +/** + * create the node client using the already passed configurations + * @param {object} opts the clients configuration + * @return {undefined} nothing + */ +module.exports = function(opts) { + return Promise.all( + opts.map(jsonqlNodeClient) + ) +} diff --git a/packages/resolver/src/client/index.js b/packages/resolver/src/client/index.js new file mode 100755 index 00000000..9df9311a --- /dev/null +++ b/packages/resolver/src/client/index.js @@ -0,0 +1,9 @@ +// import export +const injectNodeClient = require('./inject-node-clients') +const validateClientConfig = require('./validate-client-config') +const clientsGenerator = require('./clients-generator') +module.exports = { + injectNodeClient, + validateClientConfig, + clientsGenerator +} diff --git a/packages/resolver/src/client/node-client-setup.js b/packages/resolver/src/client/inject-node-clients.js similarity index 69% rename from packages/resolver/src/client/node-client-setup.js rename to packages/resolver/src/client/inject-node-clients.js index 08585741..abc93c6e 100644 --- a/packages/resolver/src/client/node-client-setup.js +++ b/packages/resolver/src/client/inject-node-clients.js @@ -1,9 +1,6 @@ -const nodeClient = require('jsonql-node-client') - - -function injectClients(resolver, clients) { +module.exports = function injectNodeClient(resolver, clients) { if (Object.getOwnPropertyDescriptor(fn, 'clients') === undefined) { Object.defineProperty(resolver, 'clients', { value: clients, diff --git a/packages/resolver/src/client/client.js b/packages/resolver/src/client/validate-client-config.js old mode 100755 new mode 100644 similarity index 47% rename from packages/resolver/src/client/client.js rename to packages/resolver/src/client/validate-client-config.js index aa75bddf..2faa814d --- a/packages/resolver/src/client/client.js +++ b/packages/resolver/src/client/validate-client-config.js @@ -1,16 +1,8 @@ const { join } = require('path') -const fs = require('fs') -const fsx = require('fs-extra') -const merge = require('lodash.merge') -const debug = require('debug')('jsonql-koa:client') -const jsonqlNodeClient = require('jsonql-node-client') - - - /** * Double check if the client config is correct or not also we could inject some of the properties here * @param {object} config configuration - * @return {object} with additional properties + * @return {object|boolean} false when there is none, with additional properties */ const validateClientConfig = function(config) { let ctn = config.clientConfig.length @@ -29,28 +21,13 @@ const validateClientConfig = function(config) { throw new Error(`[${i}] ${client.name} already existed, can not have duplicated!`) } names.push(client.name) + // next we need to create contract dir path using the name + clients.contractDir = join(config.contractDir, client.name) clients.push(client) } - config.clientConfig = clients; + return clients; } - return config; + return false; } - -/** - * This is for the resolvers to include and get their node-client - * @param {string} name this client - it get automatically generate if the user didn't provide one - * @param {object} config configuration - * @return {promise} to resolve the node client instance - */ -module.exports = function createNodeClient(name, config) { - if (!name) { - throw new Error('Name is required!') - } - if (!config.contractDir) { - throw new Error('contractDir is required') - } - config.contractDir = join(config.contractDir, name) - - return jsonqlNodeClient(config) -} +module.exports = validateClientConfig diff --git a/packages/resolver/src/provide-node-clients.js b/packages/resolver/src/provide-node-clients.js new file mode 100644 index 00000000..cd9800d8 --- /dev/null +++ b/packages/resolver/src/provide-node-clients.js @@ -0,0 +1,32 @@ +// setup and inject the clients into resolver +const { + injectNodeClient, + validateClientConfig, + clientsGenerator +} = require('./client') +let clients = [] +let hasClientConfig; + +/** + * The top level methods to inject the clients into the resolver + * @param {function} resolver the function to get injection + * @param {object} config configuration + * @return {function} the resolver with injection if any + */ +module.exports = async function provideNodeClients(resolver, config) { + if (hasClientConfig === false) { + return resolver; // nothing to do + } + // if there is cache clients + if (clients.length) { + return injectNodeClient(resolver, clients) + } + let config = validateClientConfig(config) + hasClientConfig = config; // cache it + if (hasClientConfig === false) { + return resolver; // nothing to do + } + // run setup once + clients = await clientsGenerator(hasClientConfig) + return injectNodeClient(resolver, clients) +} diff --git a/packages/resolver/src/resolve-methods.js b/packages/resolver/src/resolve-methods.js index 6b9d4236..af97826b 100644 --- a/packages/resolver/src/resolve-methods.js +++ b/packages/resolver/src/resolve-methods.js @@ -22,6 +22,8 @@ const { const searchResolvers = require('./search-resolvers') const validateAndCall = require('./validate-and-call') +const provideNodeClients = require('./client') + const debug = getDebug('resolve-method') @@ -62,6 +64,9 @@ const executeResolver = async (opts, type, resolverName, payload, contract, user fn = require(searchResolvers(resolverName, type, opts, contract)) } const args = extractArgsFromPayload(payload, type) + + fn = await provideNodeClients(fn, opts) + // here we could apply the userdata to the method const result = await validateAndCall( provideUserdata(fn, userdata), // always call it @TODO need to provide the nodeClient as well -- Gitee From 6796b930dd2cd09892546698db8c56da36192609 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Fri, 16 Aug 2019 15:50:36 +0800 Subject: [PATCH 07/21] reorganize the code and export in jsonql-resolver --- packages/resolver/index.js | 10 +++++--- packages/resolver/src/handle-auth-methods.js | 26 +++++++++++++++++--- packages/resolver/src/resolve-methods.js | 21 +--------------- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/packages/resolver/index.js b/packages/resolver/index.js index 9ef78303..e98a3cab 100644 --- a/packages/resolver/index.js +++ b/packages/resolver/index.js @@ -1,11 +1,13 @@ +const searchResolvers = require('./src/search-resolvers') +const validateAndCall = require('./src/validate-and-call') const { - getLocalValidator, executeResolver, resolverRenderHandler } = require('./src/resolve-methods') -const searchResolvers = require('./src/search-resolvers') -const validateAndCall = require('./src/validate-and-call') -const handleAuthMethods = require('./src/handle-auth-methods') +const { + getLocalValidator, + handleAuthMethods +}= require('./src/handle-auth-methods') // @TODO use the same for the jsonql-ws-server as well module.exports = { diff --git a/packages/resolver/src/handle-auth-methods.js b/packages/resolver/src/handle-auth-methods.js index 531a8cc4..33e846e5 100644 --- a/packages/resolver/src/handle-auth-methods.js +++ b/packages/resolver/src/handle-auth-methods.js @@ -24,8 +24,25 @@ const { getErrorNameByInstance, UNKNOWN_ERROR } = require('jsonql-errors') + const debug = getDebug('public-method-middleware') +/** + * if useJwt = true then use the jsonql-jwt version + * @param {object} config configuration + * @param {string} type type of call + * @param {object} contract contract.json + * @return {function} the correct handler + */ +const getLocalValidator = (config, type, contract) => { + // if you explicitly set it to false then it will be ignore + if (config.validatorHandlerName === false) { + return false; + } + let validatorFnPath = searchResolvers(config.validatorHandlerName, type, config, contract) + return require(validatorFnPath) +} + /** * This is move from the auth middleware to handle the ISSUER_NAME and LOGOUT_NAME * They both are always publicly available @@ -39,8 +56,8 @@ const handleAuthMethods = async function(ctx, resolverName, payload, opts, contr try { const { loginHandlerName } = opts; // @TODO here we intercept the result and add extra output if the useJwt is enabled - const issuerFnPath = searchResolvers(loginHandlerName, AUTH_TYPE, opts, contract); - const issuerFn = require(issuerFnPath); + const issuerFnPath = searchResolvers(loginHandlerName, AUTH_TYPE, opts, contract) + const issuerFn = require(issuerFnPath) const result = await validateAndCall( issuerFn, @@ -70,4 +87,7 @@ const handleAuthMethods = async function(ctx, resolverName, payload, opts, contr } } -module.exports = handleAuthMethods; +module.exports = { + getLocalValidator, + handleAuthMethods +} diff --git a/packages/resolver/src/resolve-methods.js b/packages/resolver/src/resolve-methods.js index af97826b..6cb0e68d 100644 --- a/packages/resolver/src/resolve-methods.js +++ b/packages/resolver/src/resolve-methods.js @@ -21,28 +21,10 @@ const { } = require('./utils') const searchResolvers = require('./search-resolvers') const validateAndCall = require('./validate-and-call') - -const provideNodeClients = require('./client') +const provideNodeClients = require('./provide-node-clients') const debug = getDebug('resolve-method') - -/** - * if useJwt = true then use the jsonql-jwt version - * @param {object} config configuration - * @param {string} type type of call - * @param {object} contract contract.json - * @return {function} the correct handler - */ -const getLocalValidator = (config, type, contract) => { - // if you explicitly set it to false then it will be ignore - if (config.validatorHandlerName === false) { - return false; - } - let validatorFnPath = searchResolvers(config.validatorHandlerName, type, config, contract) - return require(validatorFnPath) -} - /** * A new method breaking out the get resolver and prepare code * then make the original resolveMethod as a koa render handler @@ -117,7 +99,6 @@ const resolverRenderHandler = async (ctx, type, opts, contract) => { // named export instead module.exports = { - getLocalValidator, executeResolver, resolverRenderHandler } -- Gitee From ad04fc94417b9885fbbb04e9965e59ac1a40c0a5 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Fri, 16 Aug 2019 16:27:08 +0800 Subject: [PATCH 08/21] complete the inject client implementation and start creating test --- packages/resolver/package.json | 3 +- .../resolver/src/client/clients-generator.js | 2 +- .../src/client/inject-node-clients.js | 34 ++++++++++++++++++- packages/resolver/src/provide-node-clients.js | 13 +++++-- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/packages/resolver/package.json b/packages/resolver/package.json index f9ee3e1b..fa894199 100644 --- a/packages/resolver/package.json +++ b/packages/resolver/package.json @@ -8,7 +8,8 @@ "index.js" ], "scripts": { - "test": "ava", + "test": "ava --verbose", + "test:clients": "DEBUG=jsonql-resolver* ava --verbose ./tests/clients.test.js", "contract": "jsonql-contract create ./tests/fixtures/resolvers ./tests/fixtures/contract" }, "keywords": [ diff --git a/packages/resolver/src/client/clients-generator.js b/packages/resolver/src/client/clients-generator.js index 4183330c..c3ef06f3 100755 --- a/packages/resolver/src/client/clients-generator.js +++ b/packages/resolver/src/client/clients-generator.js @@ -2,7 +2,7 @@ const jsonqlNodeClient = require('jsonql-node-client') /** * create the node client using the already passed configurations * @param {object} opts the clients configuration - * @return {undefined} nothing + * @return {promise} resolve to the node client */ module.exports = function(opts) { return Promise.all( diff --git a/packages/resolver/src/client/inject-node-clients.js b/packages/resolver/src/client/inject-node-clients.js index abc93c6e..4745d433 100644 --- a/packages/resolver/src/client/inject-node-clients.js +++ b/packages/resolver/src/client/inject-node-clients.js @@ -1,9 +1,41 @@ +/** + * kind of curry the function back to inject into the resolver + * @param {array} clients the node clients + * @return {function} to the end resolver to use + */ +function resolveClients(clients) { + /** + * When pass as number then check this index, if its name then + * find with the name property, all failed then return false + * @param {number|string} + * @return {boolean|object} false when failed + */ + return function(name) { + if (typeof name === 'string') { + return clients + .filter(client => client.name === name) + .reduce((base, result) => { + return result || base; + }, false) + } + if (clients[name]) { + return clients[name] + } + return false; + } +} +/** + * inject the clients to the resolver + * @param {function} resolver the resolver to get injection + * @param {array} clients the jsonql node clients + * @return {function} the injected resolver + */ module.exports = function injectNodeClient(resolver, clients) { if (Object.getOwnPropertyDescriptor(fn, 'clients') === undefined) { Object.defineProperty(resolver, 'clients', { - value: clients, + value: resolveClients(clients), writable: false // make this immutatble }) } diff --git a/packages/resolver/src/provide-node-clients.js b/packages/resolver/src/provide-node-clients.js index cd9800d8..a803e545 100644 --- a/packages/resolver/src/provide-node-clients.js +++ b/packages/resolver/src/provide-node-clients.js @@ -4,6 +4,10 @@ const { validateClientConfig, clientsGenerator } = require('./client') +const { + getDebug +} = require('./utils') +const debug = getDebug('provide-node-clients') let clients = [] let hasClientConfig; @@ -15,18 +19,21 @@ let hasClientConfig; */ module.exports = async function provideNodeClients(resolver, config) { if (hasClientConfig === false) { + debug(`nothing to inject`) return resolver; // nothing to do } // if there is cache clients if (clients.length) { + debug(`inject client from cache`) return injectNodeClient(resolver, clients) } - let config = validateClientConfig(config) - hasClientConfig = config; // cache it + hasClientConfig = validateClientConfig(config) if (hasClientConfig === false) { + debug(`check and nothing to inject`) return resolver; // nothing to do } - // run setup once + debug(`run init clients`) + // run init client once clients = await clientsGenerator(hasClientConfig) return injectNodeClient(resolver, clients) } -- Gitee From 6b7c529b056d8f35409b34e29a38dcde48699cf1 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Fri, 16 Aug 2019 16:27:21 +0800 Subject: [PATCH 09/21] add test and associated fixtures --- packages/resolver/tests/clients.test.js | 28 +++++++++++++++++++ .../resolvers/query/call-ms-service.js | 12 ++++++++ 2 files changed, 40 insertions(+) create mode 100644 packages/resolver/tests/clients.test.js create mode 100644 packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js new file mode 100644 index 00000000..155067cf --- /dev/null +++ b/packages/resolver/tests/clients.test.js @@ -0,0 +1,28 @@ +// this is for testing the inject client +const test = require('ava') + + + +test.before(t => { + +}) + +test(`Just testing the filter / reduce method`, t => { + let name = 'name0' + let clients = [{ name }] + + let result = clients + .filter(client => client.name === name) + .reduce((base, result) => { + return result || base; + }, false) + + t.not(false, result) + +}) + + +test.skip(`The callMsService resolver should able to call another jsonql service`, async t => { + + +}) diff --git a/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js b/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js new file mode 100644 index 00000000..5eb8b518 --- /dev/null +++ b/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js @@ -0,0 +1,12 @@ + +/** + * pass a txt value then process else where + * @param {string} txt + * @return {string} transformted txt + */ +module.exports = async function callMsService(txt) { + // call another jsonql service + const client0 = await callMsService.clients('client0') + let txt0 = [txt, 'callMsService'].join(' ') + return await client0.query.callAnotherService(txt0) +} -- Gitee From 0073519d10ae146d4e1752a594b1771af7ba2b64 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Fri, 16 Aug 2019 16:29:53 +0800 Subject: [PATCH 10/21] The search clients work correctly --- packages/resolver/tests/clients.test.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index 155067cf..0395a768 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -1,6 +1,14 @@ // this is for testing the inject client const test = require('ava') +const debug = require('debug')('jsonql-resolver:test:clients') +function findClient(clients, name) { + return clients + .filter(client => client.name === name) + .reduce((base, result) => { + return result || base; + }, false) +} test.before(t => { @@ -11,14 +19,13 @@ test(`Just testing the filter / reduce method`, t => { let name = 'name0' let clients = [{ name }] - let result = clients - .filter(client => client.name === name) - .reduce((base, result) => { - return result || base; - }, false) - + let result = findClient(clients, name) + debug(result) t.not(false, result) + let result1 = findClient([], name) + t.is(false, result1) + }) -- Gitee From ab80869d6a84e5917093cfbe02968d54d6c46caf Mon Sep 17 00:00:00 2001 From: Joelchu Date: Fri, 16 Aug 2019 22:33:01 +0800 Subject: [PATCH 11/21] add the name property after the node-client init --- packages/resolver/src/client/clients-generator.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/resolver/src/client/clients-generator.js b/packages/resolver/src/client/clients-generator.js index c3ef06f3..8c90a7e2 100755 --- a/packages/resolver/src/client/clients-generator.js +++ b/packages/resolver/src/client/clients-generator.js @@ -6,6 +6,13 @@ const jsonqlNodeClient = require('jsonql-node-client') */ module.exports = function(opts) { return Promise.all( - opts.map(jsonqlNodeClient) + opts.map(opt => { + let name = opts.name; + return jsonqlNodeClient(opt) + .then(client => { + client.name = name; + return client; + }) + }) ) } -- Gitee From 95b7d5efd222f251af6e3259b99d3b51d26e44d8 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 15:24:26 +0800 Subject: [PATCH 12/21] adding new fixtures for test with clients --- packages/resolver/package.json | 4 +++- .../resolver/tests/fixtures/another-server.js | 19 +++++++++++++++++++ .../resolvers/query/another-service.js | 9 +++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 packages/resolver/tests/fixtures/another-server.js create mode 100644 packages/resolver/tests/fixtures/resolvers/query/another-service.js diff --git a/packages/resolver/package.json b/packages/resolver/package.json index fa894199..b78bb76f 100644 --- a/packages/resolver/package.json +++ b/packages/resolver/package.json @@ -28,7 +28,9 @@ }, "devDependencies": { "ava": "^2.2.0", - "jsonql-contract": "^1.7.7" + "jsonql-contract": "^1.7.7", + "jsonql-koa": "^1.3.7", + "server-io-core": "^1.2.0" }, "ava": { "files": [ diff --git a/packages/resolver/tests/fixtures/another-server.js b/packages/resolver/tests/fixtures/another-server.js new file mode 100644 index 00000000..5110a5f2 --- /dev/null +++ b/packages/resolver/tests/fixtures/another-server.js @@ -0,0 +1,19 @@ +// this is the ms run on 8001 + +const serverIoCore = require('server-io-core') +const koa = require('jsonql-koa') +const { join } = require('path') +// export the return for use later +module.exports = serverIoCore({ + webroot: ['./dummy'], + port: 8001, + debugger: false, + open: false, + socket: false, + middlewares: [ + koa({ + resolverDir: join(__dirname, 'resolvers'), + contractDir: join(__dirname, 'contract', 'another') + }) + ] +}) diff --git a/packages/resolver/tests/fixtures/resolvers/query/another-service.js b/packages/resolver/tests/fixtures/resolvers/query/another-service.js new file mode 100644 index 00000000..3f684662 --- /dev/null +++ b/packages/resolver/tests/fixtures/resolvers/query/another-service.js @@ -0,0 +1,9 @@ +// this will get call from a different setup + +/** + * @param {string} msg input + * @return {string} msg output + */ +module.exports = function anotherService(msg) { + return msg + ' another-service'; +} -- Gitee From 71843d6a194ab3efe07dc10be88b0ea39698b109 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 20:24:08 +0800 Subject: [PATCH 13/21] setup the node client test first --- packages/resolver/src/utils.js | 13 ++++++++ packages/resolver/tests/clients.test.js | 30 +++++++++++++------ .../resolver/tests/fixtures/another-server.js | 2 +- .../resolver/tests/fixtures/dummy/index.html | 9 ++++++ .../resolvers/query/another-service.js | 2 +- 5 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 packages/resolver/tests/fixtures/dummy/index.html diff --git a/packages/resolver/src/utils.js b/packages/resolver/src/utils.js index 5a1ab6b9..8c54b105 100644 --- a/packages/resolver/src/utils.js +++ b/packages/resolver/src/utils.js @@ -189,6 +189,19 @@ function importFromModule(resolverDir, type, resolverName) { return resolvers[type + resolverName] } +/** + * @param {array} clients node clients + * @param {string} name of the client + * @return {object|false} the client, false when failed + */ +function findClient(clients, name) { + return clients + .filter(client => client.name === name) + .reduce((base, result) => { + return result || base; + }, false) +} + // export module.exports = { inArray, diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index 0395a768..43f6d381 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -1,18 +1,18 @@ // this is for testing the inject client const test = require('ava') const debug = require('debug')('jsonql-resolver:test:clients') - -function findClient(clients, name) { - return clients - .filter(client => client.name === name) - .reduce((base, result) => { - return result || base; - }, false) -} +const anotherServer = require('./fixtures/another-server') +const nodeClient = require('jsonql-node-client') test.before(t => { + const { stop, app } = anotherServer() + t.context.stop = stop + t.context.app = app +}) +test.after(t => { + t.context.stop() }) test(`Just testing the filter / reduce method`, t => { @@ -20,7 +20,7 @@ test(`Just testing the filter / reduce method`, t => { let clients = [{ name }] let result = findClient(clients, name) - debug(result) + // debug(result) t.not(false, result) let result1 = findClient([], name) @@ -28,6 +28,18 @@ test(`Just testing the filter / reduce method`, t => { }) +test(`Test the nodeClient is working correctly with the configuration`, async t => { + const client = await nodeClient({ + hostname: 'http://localhost:8001', + name: 'client0' + }) + + const result = await client.anotherServer(`One`) + + t.truthy(result.indexOf('another')) + +}) + test.skip(`The callMsService resolver should able to call another jsonql service`, async t => { diff --git a/packages/resolver/tests/fixtures/another-server.js b/packages/resolver/tests/fixtures/another-server.js index 5110a5f2..7c01e161 100644 --- a/packages/resolver/tests/fixtures/another-server.js +++ b/packages/resolver/tests/fixtures/another-server.js @@ -4,7 +4,7 @@ const serverIoCore = require('server-io-core') const koa = require('jsonql-koa') const { join } = require('path') // export the return for use later -module.exports = serverIoCore({ +module.exports = () => serverIoCore({ webroot: ['./dummy'], port: 8001, debugger: false, diff --git a/packages/resolver/tests/fixtures/dummy/index.html b/packages/resolver/tests/fixtures/dummy/index.html new file mode 100644 index 00000000..d1fdcefb --- /dev/null +++ b/packages/resolver/tests/fixtures/dummy/index.html @@ -0,0 +1,9 @@ + + + + dummy + + + dummy + + diff --git a/packages/resolver/tests/fixtures/resolvers/query/another-service.js b/packages/resolver/tests/fixtures/resolvers/query/another-service.js index 3f684662..41c09f9d 100644 --- a/packages/resolver/tests/fixtures/resolvers/query/another-service.js +++ b/packages/resolver/tests/fixtures/resolvers/query/another-service.js @@ -5,5 +5,5 @@ * @return {string} msg output */ module.exports = function anotherService(msg) { - return msg + ' another-service'; + return msg + ' pass another service'; } -- Gitee From 0826263e48636d56f5c54c134e48c9b25728ec2e Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 20:34:54 +0800 Subject: [PATCH 14/21] the server and client setup ok but the client return unexpected result --- packages/resolver/src/utils.js | 3 +- packages/resolver/tests/clients.test.js | 9 ++- .../fixtures/contract/another/contract.json | 70 +++++++++++++++++ .../contract/another/public-contract.json | 76 +++++++++++++++++++ .../contract/client0/public-contract.json | 72 ++++++++++++++++++ 5 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 packages/resolver/tests/fixtures/contract/another/contract.json create mode 100644 packages/resolver/tests/fixtures/contract/another/public-contract.json create mode 100644 packages/resolver/tests/fixtures/contract/client0/public-contract.json diff --git a/packages/resolver/src/utils.js b/packages/resolver/src/utils.js index 8c54b105..2b0d0f0c 100644 --- a/packages/resolver/src/utils.js +++ b/packages/resolver/src/utils.js @@ -214,5 +214,6 @@ module.exports = { isObject, handleOutput, extractArgsFromPayload, - importFromModule + importFromModule, + findClient } diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index 43f6d381..b607fe8f 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -3,7 +3,8 @@ const test = require('ava') const debug = require('debug')('jsonql-resolver:test:clients') const anotherServer = require('./fixtures/another-server') const nodeClient = require('jsonql-node-client') - +const { findClient } = require('../src/utils') +const { join } = require('path') test.before(t => { const { stop, app } = anotherServer() @@ -25,16 +26,18 @@ test(`Just testing the filter / reduce method`, t => { let result1 = findClient([], name) t.is(false, result1) - }) test(`Test the nodeClient is working correctly with the configuration`, async t => { const client = await nodeClient({ hostname: 'http://localhost:8001', + contractDir: join(__dirname, 'fixtures', 'contract', 'client0'), name: 'client0' }) - const result = await client.anotherServer(`One`) + debug(client) + + const result = await client.query.anotherServer(`One`) t.truthy(result.indexOf('another')) diff --git a/packages/resolver/tests/fixtures/contract/another/contract.json b/packages/resolver/tests/fixtures/contract/another/contract.json new file mode 100644 index 00000000..7161d353 --- /dev/null +++ b/packages/resolver/tests/fixtures/contract/another/contract.json @@ -0,0 +1,70 @@ +{ + "query": { + "anotherService": { + "file": "/home/joel/projects/open-source/jsonql/packages/resolver/tests/fixtures/resolvers/query/another-service.js", + "description": false, + "params": [ + { + "type": [ + "string" + ], + "name": "msg", + "description": "input" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "msg output" + } + ] + }, + "callMsService": { + "file": "/home/joel/projects/open-source/jsonql/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js", + "description": "pass a txt value then process else where", + "params": [ + { + "type": [ + "string" + ], + "name": "txt" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "transformted txt" + } + ] + }, + "getSomething": { + "file": "/home/joel/projects/open-source/jsonql/packages/resolver/tests/fixtures/resolvers/query/get-something.js", + "description": false, + "params": [ + { + "type": [ + "string" + ], + "name": "name", + "description": "pass a name" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "name with prefix" + } + ] + } + }, + "mutation": {}, + "auth": {}, + "timestamp": 1566044692174, + "sourceType": "script" +} diff --git a/packages/resolver/tests/fixtures/contract/another/public-contract.json b/packages/resolver/tests/fixtures/contract/another/public-contract.json new file mode 100644 index 00000000..30adf84a --- /dev/null +++ b/packages/resolver/tests/fixtures/contract/another/public-contract.json @@ -0,0 +1,76 @@ +{ + "query": { + "helloWorld": { + "description": "This is the stock resolver for testing purpose", + "params": [], + "returns": [ + { + "type": "string", + "description": "stock message" + } + ] + }, + "anotherService": { + "description": false, + "params": [ + { + "type": [ + "string" + ], + "name": "msg", + "description": "input" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "msg output" + } + ] + }, + "callMsService": { + "description": "pass a txt value then process else where", + "params": [ + { + "type": [ + "string" + ], + "name": "txt" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "transformted txt" + } + ] + }, + "getSomething": { + "description": false, + "params": [ + { + "type": [ + "string" + ], + "name": "name", + "description": "pass a name" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "name with prefix" + } + ] + } + }, + "mutation": {}, + "auth": {}, + "timestamp": 1566044692174 +} diff --git a/packages/resolver/tests/fixtures/contract/client0/public-contract.json b/packages/resolver/tests/fixtures/contract/client0/public-contract.json new file mode 100644 index 00000000..9740af7b --- /dev/null +++ b/packages/resolver/tests/fixtures/contract/client0/public-contract.json @@ -0,0 +1,72 @@ +{ + "query": { + "helloWorld": { + "params": [], + "returns": [ + { + "type": "string", + "description": "stock message" + } + ] + }, + "anotherService": { + "params": [ + { + "type": [ + "string" + ], + "name": "msg", + "description": "input" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "msg output" + } + ] + }, + "callMsService": { + "params": [ + { + "type": [ + "string" + ], + "name": "txt" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "transformted txt" + } + ] + }, + "getSomething": { + "params": [ + { + "type": [ + "string" + ], + "name": "name", + "description": "pass a name" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "name with prefix" + } + ] + } + }, + "mutation": {}, + "auth": {}, + "timestamp": 1566044692174 +} -- Gitee From ed958b16816351839b08a24058758c30582a1920 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 20:51:02 +0800 Subject: [PATCH 15/21] the node client test fixed --- packages/resolver/tests/clients.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index b607fe8f..c6c87913 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -35,9 +35,9 @@ test(`Test the nodeClient is working correctly with the configuration`, async t name: 'client0' }) - debug(client) + // debug(client) - const result = await client.query.anotherServer(`One`) + const result = await client.query.anotherService(`One`) t.truthy(result.indexOf('another')) -- Gitee From 006dea044d42b5a4915883efe2702547d33d2653 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 22:53:58 +0800 Subject: [PATCH 16/21] breaking the helper functions --- packages/resolver/tests/base.test.js | 14 +----- packages/resolver/tests/clients.test.js | 46 +++++++++++++------ packages/resolver/tests/fixtures/read-json.js | 12 +++++ 3 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 packages/resolver/tests/fixtures/read-json.js diff --git a/packages/resolver/tests/base.test.js b/packages/resolver/tests/base.test.js index ca0c4e31..01562458 100644 --- a/packages/resolver/tests/base.test.js +++ b/packages/resolver/tests/base.test.js @@ -3,17 +3,7 @@ const fs = require('fs') const { join } = require('path') const { executeResolver } = require('../') const { createQuery } = require('jsonql-params-validator') - -const readJson = file => { - return new Promise((resolver, rejecter) => { - fs.readFile(file, 'utf8', function (err, data) { - if (err) { - return rejecter(err) - } - resolver(JSON.parse(data)) - }) - }) -} +const readJson = require('./fixtures/read-json') const contractPath = join(__dirname, 'fixtures', 'contract', 'contract.json') @@ -24,7 +14,7 @@ test.before(async t => { contractDir: join(__dirname, 'fixtures', 'contract') } }) - + test(`It should able to call a resolver`, async t => { const resolverName = 'getSomething'; const payload = createQuery(resolverName, ['Joel']) diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index c6c87913..4ffa8a4d 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -5,11 +5,28 @@ const anotherServer = require('./fixtures/another-server') const nodeClient = require('jsonql-node-client') const { findClient } = require('../src/utils') const { join } = require('path') +const { executeResolver } = require('../') +const readJson = require('./fixtures/read-json') + +const contractPath = join(__dirname, 'fixtures', 'contract', 'contract.json') test.before(t => { const { stop, app } = anotherServer() t.context.stop = stop t.context.app = app + + t.context.clientConfig = { + hostname: 'http://localhost:8001', + contractDir: join(__dirname, 'fixtures', 'contract', 'client0'), + name: 'client0' + } + + t.context.contract = await readJson(contractPath) + t.context.opts = { + resolverDir: join(__dirname, 'fixtures', 'resolvers'), + contractDir: join(__dirname, 'fixtures', 'contract') + } + }) test.after(t => { @@ -19,32 +36,35 @@ test.after(t => { test(`Just testing the filter / reduce method`, t => { let name = 'name0' let clients = [{ name }] - let result = findClient(clients, name) - // debug(result) t.not(false, result) - let result1 = findClient([], name) t.is(false, result1) }) test(`Test the nodeClient is working correctly with the configuration`, async t => { - const client = await nodeClient({ - hostname: 'http://localhost:8001', - contractDir: join(__dirname, 'fixtures', 'contract', 'client0'), - name: 'client0' - }) - - // debug(client) - + const client = await nodeClient(t.context.clientConfig) const result = await client.query.anotherService(`One`) - t.truthy(result.indexOf('another')) - }) test.skip(`The callMsService resolver should able to call another jsonql service`, async t => { + const resolverName = 'callMsService'; + const payload = createQuery(resolverName, ['Joel']) + + let opts = t.context.opts; + opts.clientConfig = t.context.clientConfig; + + const result = await executeResolver( + opts, + 'query', + resolverName, + payload[resolverName], + t.context.contract + ) + + t.truthy(result.indexOf('another service')) }) diff --git a/packages/resolver/tests/fixtures/read-json.js b/packages/resolver/tests/fixtures/read-json.js new file mode 100644 index 00000000..d2d618b1 --- /dev/null +++ b/packages/resolver/tests/fixtures/read-json.js @@ -0,0 +1,12 @@ +const readJson = file => { + return new Promise((resolver, rejecter) => { + fs.readFile(file, 'utf8', function (err, data) { + if (err) { + return rejecter(err) + } + resolver(JSON.parse(data)) + }) + }) +} + +module.exports = readJson -- Gitee From a7167b0e47ad6ca0a35a85ae1cae3b4b225cef98 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 23:09:04 +0800 Subject: [PATCH 17/21] fixed up the contract problem now looking at the node client init problem --- packages/resolver/src/client/index.js | 1 + packages/resolver/src/search-resolvers.js | 1 + packages/resolver/src/utils.js | 13 ++++++ packages/resolver/tests/base.test.js | 2 +- packages/resolver/tests/clients.test.js | 6 ++- .../tests/fixtures/contract/contract.json | 43 ++++++++++++++++++- packages/resolver/tests/fixtures/read-json.js | 2 + 7 files changed, 64 insertions(+), 4 deletions(-) diff --git a/packages/resolver/src/client/index.js b/packages/resolver/src/client/index.js index 9df9311a..62defabc 100755 --- a/packages/resolver/src/client/index.js +++ b/packages/resolver/src/client/index.js @@ -2,6 +2,7 @@ const injectNodeClient = require('./inject-node-clients') const validateClientConfig = require('./validate-client-config') const clientsGenerator = require('./clients-generator') +// export module.exports = { injectNodeClient, validateClientConfig, diff --git a/packages/resolver/src/search-resolvers.js b/packages/resolver/src/search-resolvers.js index 072bbf2d..b986b10b 100644 --- a/packages/resolver/src/search-resolvers.js +++ b/packages/resolver/src/search-resolvers.js @@ -42,6 +42,7 @@ module.exports = function searchResolvers(name, type, opts, contract) { if (search !== false) { return search; } + debug(`contract is not contract?`, contract) // search by running const filePath = getPathToFn(name, type, opts) if (filePath) { diff --git a/packages/resolver/src/utils.js b/packages/resolver/src/utils.js index 2b0d0f0c..eb4681c4 100644 --- a/packages/resolver/src/utils.js +++ b/packages/resolver/src/utils.js @@ -22,6 +22,19 @@ const { DEFAULT_RESOLVER_IMPORT_FILE_NAME, } = require('jsonql-constants') +/** + * From underscore.string library + * @BUG there is a bug here with the non-standard name start with _ + * @param {string} str string + * @return {string} dasherize string + */ +const dasherize = str => ( + trim(str) + .replace(/([A-Z])/g, '-$1') + .replace(/[-_\s]+/g, '-') + .toLowerCase() +) + // export a create debug method const debug = require('debug') /** diff --git a/packages/resolver/tests/base.test.js b/packages/resolver/tests/base.test.js index 01562458..eccddc83 100644 --- a/packages/resolver/tests/base.test.js +++ b/packages/resolver/tests/base.test.js @@ -1,5 +1,5 @@ const test = require('ava') -const fs = require('fs') + const { join } = require('path') const { executeResolver } = require('../') const { createQuery } = require('jsonql-params-validator') diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index 4ffa8a4d..397729d8 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -7,10 +7,12 @@ const { findClient } = require('../src/utils') const { join } = require('path') const { executeResolver } = require('../') const readJson = require('./fixtures/read-json') +const { createQuery } = require('jsonql-params-validator') + const contractPath = join(__dirname, 'fixtures', 'contract', 'contract.json') -test.before(t => { +test.before(async t => { const { stop, app } = anotherServer() t.context.stop = stop t.context.app = app @@ -49,7 +51,7 @@ test(`Test the nodeClient is working correctly with the configuration`, async t }) -test.skip(`The callMsService resolver should able to call another jsonql service`, async t => { +test.only(`The callMsService resolver should able to call another jsonql service`, async t => { const resolverName = 'callMsService'; const payload = createQuery(resolverName, ['Joel']) diff --git a/packages/resolver/tests/fixtures/contract/contract.json b/packages/resolver/tests/fixtures/contract/contract.json index 995ddff7..ccb1840a 100644 --- a/packages/resolver/tests/fixtures/contract/contract.json +++ b/packages/resolver/tests/fixtures/contract/contract.json @@ -1,5 +1,46 @@ { "query": { + "anotherService": { + "file": "/home/joel/projects/open-source/jsonql/packages/resolver/tests/fixtures/resolvers/query/another-service.js", + "description": false, + "params": [ + { + "type": [ + "string" + ], + "name": "msg", + "description": "input" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "msg output" + } + ] + }, + "callMsService": { + "file": "/home/joel/projects/open-source/jsonql/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js", + "description": "pass a txt value then process else where", + "params": [ + { + "type": [ + "string" + ], + "name": "txt" + } + ], + "returns": [ + { + "type": [ + "string" + ], + "description": "transformted txt" + } + ] + }, "getSomething": { "file": "/home/joel/projects/open-source/jsonql/packages/resolver/tests/fixtures/resolvers/query/get-something.js", "description": false, @@ -24,6 +65,6 @@ }, "mutation": {}, "auth": {}, - "timestamp": 1565785436688, + "timestamp": 1566054454129, "sourceType": "script" } diff --git a/packages/resolver/tests/fixtures/read-json.js b/packages/resolver/tests/fixtures/read-json.js index d2d618b1..499cf6b0 100644 --- a/packages/resolver/tests/fixtures/read-json.js +++ b/packages/resolver/tests/fixtures/read-json.js @@ -1,3 +1,5 @@ +const fs = require('fs') + const readJson = file => { return new Promise((resolver, rejecter) => { fs.readFile(file, 'utf8', function (err, data) { -- Gitee From 57e09b0bb038070051f08b60da0cc2956954c7ec Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sat, 17 Aug 2019 23:38:30 +0800 Subject: [PATCH 18/21] fixed up all the problems now --- packages/resolver/src/client/clients-generator.js | 2 +- packages/resolver/src/client/inject-node-clients.js | 6 ++++-- .../resolver/src/client/validate-client-config.js | 9 ++++++++- packages/resolver/src/provide-node-clients.js | 2 +- packages/resolver/src/resolve-methods.js | 3 +-- packages/resolver/tests/clients.test.js | 12 ++++++------ .../fixtures/resolvers/query/call-ms-service.js | 9 ++++++--- 7 files changed, 27 insertions(+), 16 deletions(-) diff --git a/packages/resolver/src/client/clients-generator.js b/packages/resolver/src/client/clients-generator.js index 8c90a7e2..c23fd857 100755 --- a/packages/resolver/src/client/clients-generator.js +++ b/packages/resolver/src/client/clients-generator.js @@ -7,7 +7,7 @@ const jsonqlNodeClient = require('jsonql-node-client') module.exports = function(opts) { return Promise.all( opts.map(opt => { - let name = opts.name; + let name = opt.name; return jsonqlNodeClient(opt) .then(client => { client.name = name; diff --git a/packages/resolver/src/client/inject-node-clients.js b/packages/resolver/src/client/inject-node-clients.js index 4745d433..d8abe5c6 100644 --- a/packages/resolver/src/client/inject-node-clients.js +++ b/packages/resolver/src/client/inject-node-clients.js @@ -1,4 +1,5 @@ - +const { getDebug } = require('../utils') +const debug = getDebug(`inject-node-clients`) /** * kind of curry the function back to inject into the resolver * @param {array} clients the node clients @@ -12,6 +13,7 @@ function resolveClients(clients) { * @return {boolean|object} false when failed */ return function(name) { + debug(`resolveClients ${name}`, clients) if (typeof name === 'string') { return clients .filter(client => client.name === name) @@ -33,7 +35,7 @@ function resolveClients(clients) { * @return {function} the injected resolver */ module.exports = function injectNodeClient(resolver, clients) { - if (Object.getOwnPropertyDescriptor(fn, 'clients') === undefined) { + if (Object.getOwnPropertyDescriptor(resolver, 'clients') === undefined) { Object.defineProperty(resolver, 'clients', { value: resolveClients(clients), writable: false // make this immutatble diff --git a/packages/resolver/src/client/validate-client-config.js b/packages/resolver/src/client/validate-client-config.js index 2faa814d..44487e5f 100644 --- a/packages/resolver/src/client/validate-client-config.js +++ b/packages/resolver/src/client/validate-client-config.js @@ -1,4 +1,6 @@ const { join } = require('path') +const { getDebug, inArray } = require('../utils') +const debug = getDebug('validate-client-config') /** * Double check if the client config is correct or not also we could inject some of the properties here * @param {object} config configuration @@ -6,7 +8,11 @@ const { join } = require('path') */ const validateClientConfig = function(config) { let ctn = config.clientConfig.length + + debug(`client config ${ctn}`) + if (ctn) { + let names = [] let clients = [] for (let i = 0; i < ctn; ++i) { @@ -14,10 +20,11 @@ const validateClientConfig = function(config) { if (!client.hostname) { throw new Error(`Missing hostname in client config ${i}`) } + debug(`name: ${client.name}`) if (!client.name) { client.name = `nodeClient${i}` } - if (inArray(client.name, names)) { + if (inArray(names, client.name)) { throw new Error(`[${i}] ${client.name} already existed, can not have duplicated!`) } names.push(client.name) diff --git a/packages/resolver/src/provide-node-clients.js b/packages/resolver/src/provide-node-clients.js index a803e545..d35f96cd 100644 --- a/packages/resolver/src/provide-node-clients.js +++ b/packages/resolver/src/provide-node-clients.js @@ -29,7 +29,7 @@ module.exports = async function provideNodeClients(resolver, config) { } hasClientConfig = validateClientConfig(config) if (hasClientConfig === false) { - debug(`check and nothing to inject`) + debug(`check and nothing to inject`, config) return resolver; // nothing to do } debug(`run init clients`) diff --git a/packages/resolver/src/resolve-methods.js b/packages/resolver/src/resolve-methods.js index 6cb0e68d..bcfa0d13 100644 --- a/packages/resolver/src/resolve-methods.js +++ b/packages/resolver/src/resolve-methods.js @@ -46,9 +46,8 @@ const executeResolver = async (opts, type, resolverName, payload, contract, user fn = require(searchResolvers(resolverName, type, opts, contract)) } const args = extractArgsFromPayload(payload, type) - + // inject the node client if any fn = await provideNodeClients(fn, opts) - // here we could apply the userdata to the method const result = await validateAndCall( provideUserdata(fn, userdata), // always call it @TODO need to provide the nodeClient as well diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index 397729d8..08c647c9 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -8,9 +8,9 @@ const { join } = require('path') const { executeResolver } = require('../') const readJson = require('./fixtures/read-json') const { createQuery } = require('jsonql-params-validator') +const baseDir = join(__dirname, 'fixtures') - -const contractPath = join(__dirname, 'fixtures', 'contract', 'contract.json') +const contractPath = join(baseDir, 'contract', 'contract.json') test.before(async t => { const { stop, app } = anotherServer() @@ -19,14 +19,14 @@ test.before(async t => { t.context.clientConfig = { hostname: 'http://localhost:8001', - contractDir: join(__dirname, 'fixtures', 'contract', 'client0'), + contractDir: join(baseDir, 'contract', 'client0'), name: 'client0' } t.context.contract = await readJson(contractPath) t.context.opts = { - resolverDir: join(__dirname, 'fixtures', 'resolvers'), - contractDir: join(__dirname, 'fixtures', 'contract') + resolverDir: join(baseDir, 'resolvers'), + contractDir: join(baseDir, 'contract') } }) @@ -57,7 +57,7 @@ test.only(`The callMsService resolver should able to call another jsonql service const payload = createQuery(resolverName, ['Joel']) let opts = t.context.opts; - opts.clientConfig = t.context.clientConfig; + opts.clientConfig = [t.context.clientConfig]; const result = await executeResolver( opts, diff --git a/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js b/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js index 5eb8b518..ad21026f 100644 --- a/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js +++ b/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js @@ -1,4 +1,4 @@ - +const debug = require('debug')('jsonql-resolver:call-ms-service') /** * pass a txt value then process else where * @param {string} txt @@ -7,6 +7,9 @@ module.exports = async function callMsService(txt) { // call another jsonql service const client0 = await callMsService.clients('client0') - let txt0 = [txt, 'callMsService'].join(' ') - return await client0.query.callAnotherService(txt0) + + debug(client0) + + let txt0 = ['callMsService', txt].join(' ') + return await client0.query.anotherService(txt0) } -- Gitee From 870720a14aa6bdaa41c7524cd8e9c12a2688ca04 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sun, 18 Aug 2019 10:42:41 +0800 Subject: [PATCH 19/21] test passed but the contract dir for node client still in the wrong place --- .../src/client/validate-client-config.js | 10 ++- packages/resolver/tests/clients.test.js | 5 +- .../fixtures/contract/another/contract.json | 2 +- .../contract/another/public-contract.json | 2 +- .../contract/client0/public-contract.json | 72 ------------------- .../resolvers/query/call-ms-service.js | 2 +- 6 files changed, 8 insertions(+), 85 deletions(-) delete mode 100644 packages/resolver/tests/fixtures/contract/client0/public-contract.json diff --git a/packages/resolver/src/client/validate-client-config.js b/packages/resolver/src/client/validate-client-config.js index 44487e5f..eca0d2ca 100644 --- a/packages/resolver/src/client/validate-client-config.js +++ b/packages/resolver/src/client/validate-client-config.js @@ -7,12 +7,10 @@ const debug = getDebug('validate-client-config') * @return {object|boolean} false when there is none, with additional properties */ const validateClientConfig = function(config) { - let ctn = config.clientConfig.length - - debug(`client config ${ctn}`) - + const ctn = config.clientConfig.length; + // take the contractDir from the main + const contractDir = config.contractDir; if (ctn) { - let names = [] let clients = [] for (let i = 0; i < ctn; ++i) { @@ -29,7 +27,7 @@ const validateClientConfig = function(config) { } names.push(client.name) // next we need to create contract dir path using the name - clients.contractDir = join(config.contractDir, client.name) + clients.contractDir = join(contractDir, client.name) clients.push(client) } return clients; diff --git a/packages/resolver/tests/clients.test.js b/packages/resolver/tests/clients.test.js index 08c647c9..011043d7 100644 --- a/packages/resolver/tests/clients.test.js +++ b/packages/resolver/tests/clients.test.js @@ -18,9 +18,7 @@ test.before(async t => { t.context.app = app t.context.clientConfig = { - hostname: 'http://localhost:8001', - contractDir: join(baseDir, 'contract', 'client0'), - name: 'client0' + hostname: 'http://localhost:8001' } t.context.contract = await readJson(contractPath) @@ -50,7 +48,6 @@ test(`Test the nodeClient is working correctly with the configuration`, async t t.truthy(result.indexOf('another')) }) - test.only(`The callMsService resolver should able to call another jsonql service`, async t => { const resolverName = 'callMsService'; diff --git a/packages/resolver/tests/fixtures/contract/another/contract.json b/packages/resolver/tests/fixtures/contract/another/contract.json index 7161d353..94ca5869 100644 --- a/packages/resolver/tests/fixtures/contract/another/contract.json +++ b/packages/resolver/tests/fixtures/contract/another/contract.json @@ -65,6 +65,6 @@ }, "mutation": {}, "auth": {}, - "timestamp": 1566044692174, + "timestamp": 1566096001328, "sourceType": "script" } diff --git a/packages/resolver/tests/fixtures/contract/another/public-contract.json b/packages/resolver/tests/fixtures/contract/another/public-contract.json index 30adf84a..162f4494 100644 --- a/packages/resolver/tests/fixtures/contract/another/public-contract.json +++ b/packages/resolver/tests/fixtures/contract/another/public-contract.json @@ -72,5 +72,5 @@ }, "mutation": {}, "auth": {}, - "timestamp": 1566044692174 + "timestamp": 1566096001328 } diff --git a/packages/resolver/tests/fixtures/contract/client0/public-contract.json b/packages/resolver/tests/fixtures/contract/client0/public-contract.json deleted file mode 100644 index 9740af7b..00000000 --- a/packages/resolver/tests/fixtures/contract/client0/public-contract.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "query": { - "helloWorld": { - "params": [], - "returns": [ - { - "type": "string", - "description": "stock message" - } - ] - }, - "anotherService": { - "params": [ - { - "type": [ - "string" - ], - "name": "msg", - "description": "input" - } - ], - "returns": [ - { - "type": [ - "string" - ], - "description": "msg output" - } - ] - }, - "callMsService": { - "params": [ - { - "type": [ - "string" - ], - "name": "txt" - } - ], - "returns": [ - { - "type": [ - "string" - ], - "description": "transformted txt" - } - ] - }, - "getSomething": { - "params": [ - { - "type": [ - "string" - ], - "name": "name", - "description": "pass a name" - } - ], - "returns": [ - { - "type": [ - "string" - ], - "description": "name with prefix" - } - ] - } - }, - "mutation": {}, - "auth": {}, - "timestamp": 1566044692174 -} diff --git a/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js b/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js index ad21026f..db4be926 100644 --- a/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js +++ b/packages/resolver/tests/fixtures/resolvers/query/call-ms-service.js @@ -6,7 +6,7 @@ const debug = require('debug')('jsonql-resolver:call-ms-service') */ module.exports = async function callMsService(txt) { // call another jsonql service - const client0 = await callMsService.clients('client0') + const client0 = await callMsService.clients('nodeClient0') debug(client0) -- Gitee From 9b99c15e77d572af82e52a5630470cc3490a5366 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sun, 18 Aug 2019 11:19:45 +0800 Subject: [PATCH 20/21] add several debug to node-client to find out why the contractDir is incorrect --- packages/node-client/package.json | 2 +- packages/node-client/src/jsonql/get-remote-contract.js | 4 +++- packages/node-client/src/jsonql/jsonql-base-cls.js | 1 + packages/node-client/src/jsonql/request-client.js | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/node-client/package.json b/packages/node-client/package.json index d9e8d209..44b99fa0 100755 --- a/packages/node-client/package.json +++ b/packages/node-client/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-node-client", - "version": "1.1.4", + "version": "1.1.5", "description": "jsonql node.js client using request", "main": "index.js", "scripts": { diff --git a/packages/node-client/src/jsonql/get-remote-contract.js b/packages/node-client/src/jsonql/get-remote-contract.js index 3b6ef192..8efecfe7 100755 --- a/packages/node-client/src/jsonql/get-remote-contract.js +++ b/packages/node-client/src/jsonql/get-remote-contract.js @@ -34,7 +34,9 @@ module.exports = function getRemoteContract(args) { return rejecter(json.error || 'Server return wrong contract format') } const contract = json.data; - const outFile = join( resolve(args.out) || process.cwd(), PUBLIC_CONTRACT_FILE_NAME ) + const outDir = args.out ? resolve(args.out) : process.cwd() + const outFile = join(outDir, PUBLIC_CONTRACT_FILE_NAME) + debug(`outFile to: ${outFile}`) // v1.1.4 add raw output if (args.raw) { return resolver(contract) diff --git a/packages/node-client/src/jsonql/jsonql-base-cls.js b/packages/node-client/src/jsonql/jsonql-base-cls.js index ec813291..8d9e9373 100755 --- a/packages/node-client/src/jsonql/jsonql-base-cls.js +++ b/packages/node-client/src/jsonql/jsonql-base-cls.js @@ -156,6 +156,7 @@ class JsonqlClient { if (this.opts.contractKey !== false) { authHeader = {[this.opts.contractKeyName]: this.opts.contractKey} } + debug(`contract out: ${this.opts.contractDir}`) // use the remote method to get it return getRemote(Object.assign({ remote: this.__url__, diff --git a/packages/node-client/src/jsonql/request-client.js b/packages/node-client/src/jsonql/request-client.js index 6f125963..ffc5c01d 100755 --- a/packages/node-client/src/jsonql/request-client.js +++ b/packages/node-client/src/jsonql/request-client.js @@ -26,7 +26,7 @@ class JsonqlRequestClient extends JsonqlClient { return fsx.readJsonSync(result); } return result; - }); + }) } /** @@ -60,7 +60,7 @@ class JsonqlRequestClient extends JsonqlClient { debug('error happens here!', e) rejecter(e) } - }); + }) } /** -- Gitee From 19c920bddb5285a11b0843ebb8fff7945482b4a2 Mon Sep 17 00:00:00 2001 From: Joelchu Date: Sun, 18 Aug 2019 12:04:17 +0800 Subject: [PATCH 21/21] fix the wrong directory name for contract to DEFAULT_CONTRACT_DIR --- packages/node-client/src/check-options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node-client/src/check-options.js b/packages/node-client/src/check-options.js index ac6246cf..67afb019 100755 --- a/packages/node-client/src/check-options.js +++ b/packages/node-client/src/check-options.js @@ -59,7 +59,7 @@ const appProps = { contractKey: constructConfig(false, [BOOLEAN_TYPE, STRING_TYPE]), // if the server side is lock by the key you need this contractKeyName: constructConfig(CONTRACT_KEY_NAME, STRING_TYPE),// same as above they go in pairs // we don't really need to check this, it will get generated - contractDir: constructConfig( join(BASE_DIR, DEFAULT_RESOLVER_DIR), STRING_TYPE), + contractDir: constructConfig( join(BASE_DIR, DEFAULT_CONTRACT_DIR), STRING_TYPE), contractFileName: constructConfig(PUBLIC_CONTRACT_FILE_NAME, STRING_TYPE), // functions storeAuthToken: constructConfig(false, BOOLEAN_TYPE), -- Gitee