diff --git a/packages/@jsonql/event/package.json b/packages/@jsonql/event/package.json index 24bc4ee7e036b32e1f67867d5c6d7bd59e4b3d55..3dc114ea337d29ec283cf15b15fa3861b085d074 100644 --- a/packages/@jsonql/event/package.json +++ b/packages/@jsonql/event/package.json @@ -1,6 +1,6 @@ { "name": "@jsonql/event", - "version": "1.2.2", + "version": "1.2.3", "description": "Event handler library ported from nb-event-service rewritten with Typescript", "main": "dist/jsonql-event.cjs.js", "browser": "dist/jsonql-event.umd.js", @@ -33,7 +33,7 @@ "bugs": { "url": "https://gitee.com/to1source/jsonql/issues" }, - "homepage": "https://gitee.com/to1source/jsonql#readme", + "homepage": "https://jsonql.js.org", "license": "ISC", "devDependencies": { "ava": "^2.2.0", diff --git a/packages/express/package.json b/packages/@jsonql/express/package.json similarity index 100% rename from packages/express/package.json rename to packages/@jsonql/express/package.json diff --git a/packages/@jsonql/koa/config/default.json b/packages/@jsonql/koa/config/default.json deleted file mode 100644 index 8ca2dd8efcc89f2d43a07d45dc5f1228cd6df712..0000000000000000000000000000000000000000 --- a/packages/@jsonql/koa/config/default.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "jsonql-koa-stock-setup", - "port": 8001 -} diff --git a/packages/@jsonql/koa/index.js b/packages/@jsonql/koa/index.js index 1c40fe926a9a36973a4ed389eca12fb286a03db8..21db2e946c2771675e39fa1bbec1d4bd0fb43f6e 100644 --- a/packages/@jsonql/koa/index.js +++ b/packages/@jsonql/koa/index.js @@ -4,6 +4,16 @@ const Koa = require('koa') const cors = require('koa-cors') const bodyparser = require('koa-bodyparser') const jsonql = require('jsonql-koa') +const DEFAULT_PORT = 8001; +/** + * simple util method to get the value + * @param {string} name of the key + * @param {object} obj to take value from + * @return {*} the object value id by name or undefined + */ +const getConfigValue = (name, obj) => ( + (name in obj) ? obj[name] : undefined +) /** * @param {object} [config={}] configuration @@ -11,10 +21,15 @@ const jsonql = require('jsonql-koa') */ module.exports = function(config = {}) { - const port = ('port' in config) ? config.port : 8001; + const port = getConfigValue('port', config) || DEFAULT_PORT; + //('port' in config) ? config.port : 8001; const app = new Koa() - app.use(cors()) + let noCors = getConfigValue('cors', config) + if (noCors === undefined || noCors !== false) { + debug(`use cors plugin`) + app.use(cors()) + } app.use(bodyparser()) app.use(jsonql(config)) @@ -24,7 +39,7 @@ module.exports = function(config = {}) { server.close() } debug(`@jsonql/koa server started on @${port}`) - + return { app, server, diff --git a/packages/@jsonql/koa/src/contracts/index.js b/packages/@jsonql/koa/src/contracts/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d0f6bcd5bfaa417ef7149a7b5e2daa07738d207c --- /dev/null +++ b/packages/@jsonql/koa/src/contracts/index.js @@ -0,0 +1 @@ +// contract related methods export diff --git a/packages/@jsonql/koa/src/index.js b/packages/@jsonql/koa/src/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4894a8771e557662919193ad73b9b00460704bd2 --- /dev/null +++ b/packages/@jsonql/koa/src/index.js @@ -0,0 +1 @@ +// completely reorganize the folder structure etc diff --git a/packages/@jsonql/koa/src/middlewares/index.js b/packages/@jsonql/koa/src/middlewares/index.js new file mode 100644 index 0000000000000000000000000000000000000000..17ee5c44eded2377ea5684db48e628f9c90bdc72 --- /dev/null +++ b/packages/@jsonql/koa/src/middlewares/index.js @@ -0,0 +1 @@ +// all middleware export diff --git a/packages/@jsonql/koa/src/options/index.js b/packages/@jsonql/koa/src/options/index.js new file mode 100644 index 0000000000000000000000000000000000000000..55c1ad22e0d8e28b5b7c1aa2e78b1a07af6c4581 --- /dev/null +++ b/packages/@jsonql/koa/src/options/index.js @@ -0,0 +1 @@ +// all the configuration options related methods export diff --git a/packages/@jsonql/koa/src/utils/index.js b/packages/@jsonql/koa/src/utils/index.js new file mode 100644 index 0000000000000000000000000000000000000000..988bb80d7083a5921542b0877079e3f79b5e44fd --- /dev/null +++ b/packages/@jsonql/koa/src/utils/index.js @@ -0,0 +1,33 @@ +// the utils methods export +const processJwtKeys = require('./config-check/process-jwt-keys') +const { createTokenValidator } = require('jsonql-jwt') + +const { + chainFns, + + inArray, + getDebug, + + headerParser, + getDocLen, + packResult, + printError, + forbiddenHandler, + ctxErrorHandler, + + isJsonqlPath, + isJsonqlRequest, + isJsonqlConsoleUrl, + + getCallMethod, + isHeaderPresent, + + isObject, + isNotEmpty, + isContractJson, + handleOutput, + extractArgsFromPayload, + getNameFromPayload, + + extractParamsFromContract +} = require('./utils') diff --git a/packages/@jsonql/koa/ts/README.md b/packages/@jsonql/koa/ts/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2761d5e3c992498e140c092fd7167a4503009908 --- /dev/null +++ b/packages/@jsonql/koa/ts/README.md @@ -0,0 +1,5 @@ +# Typescript port + +There was an idea to port this into Typescript but later on, I found it completely pointless and waste of time. +Since Typescript running from node.js is NOT real language. Instead we move our focus onto deno.js instead, +which Typescript is support natively diff --git a/packages/@jsonql/ws/index.js b/packages/@jsonql/ws/index.js new file mode 100644 index 0000000000000000000000000000000000000000..35ee6a2ac0c4dbbfc7d4b79ce72f389c5d3c86ac --- /dev/null +++ b/packages/@jsonql/ws/index.js @@ -0,0 +1,2 @@ +// this is the module entry point for ES6 for client +// the main will point to the node.js server side setup diff --git a/packages/@jsonql/ws/package.json b/packages/@jsonql/ws/package.json index 05aff1f4eff3a2abe8bac4f563d0dc089036c449..b431434a23816d0f10b4be53c06bd9925b629c59 100644 --- a/packages/@jsonql/ws/package.json +++ b/packages/@jsonql/ws/package.json @@ -2,7 +2,9 @@ "name": "@jsonql/ws", "version": "0.0.1", "description": "WS (WebSocket) client / server module for jsonql", - "main": "index.js", + "main": "server.js", + "module": "index.js", + "browser": "dist/jsonql-ws.umd.js", "scripts": { "test": "ava" }, diff --git a/packages/@jsonql/ws/server.js b/packages/@jsonql/ws/server.js new file mode 100644 index 0000000000000000000000000000000000000000..431563448ef14a2700b978f361b225cc17fe5a8e --- /dev/null +++ b/packages/@jsonql/ws/server.js @@ -0,0 +1 @@ +// this is the server side setup diff --git a/packages/constants/constants.json b/packages/constants/constants.json index 30fcf7dfadce1254d493595b03f86580580b387b..520eabba6cc36d42c534d0a718bf7f4a3d77ae1a 100644 --- a/packages/constants/constants.json +++ b/packages/constants/constants.json @@ -168,5 +168,8 @@ "PUBLIC_KEY_NAME": "publicKey", "PRIVATE_KEY_NAME": "privateKey", "DEFAULT_PUBLIC_KEY_FILE": "publicKey.pem", - "DEFAULT_PRIVATE_KEY_FILE": "privateKey.pem" + "DEFAULT_PRIVATE_KEY_FILE": "privateKey.pem", + "SUCCESS_STATUS": 200, + "FORBIDDEN_STATUS": 403, + "NOT_FOUND_STATUS": 404 } diff --git a/packages/constants/main.js b/packages/constants/main.js index 9bfda742b6694cc807bb33a6265b9119f2f9897d..e68b2023edfef055ae75a6ca57fa9eb56f6658b7 100644 --- a/packages/constants/main.js +++ b/packages/constants/main.js @@ -166,5 +166,9 @@ export const PEM_EXT = 'pem'; export const PUBLIC_KEY_NAME = 'publicKey'; export const PRIVATE_KEY_NAME = 'privateKey'; -export const DEFAULT_PUBLIC_KEY_FILE = [PUBLIC_KEY_NAME, PEM_EXT].join('.'); -export const DEFAULT_PRIVATE_KEY_FILE = [PRIVATE_KEY_NAME, PEM_EXT].join('.'); +export const DEFAULT_PUBLIC_KEY_FILE = [PUBLIC_KEY_NAME, PEM_EXT].join('.') +export const DEFAULT_PRIVATE_KEY_FILE = [PRIVATE_KEY_NAME, PEM_EXT].join('.') + +export const SUCCESS_STATUS = 200; +export const FORBIDDEN_STATUS = 403; +export const NOT_FOUND_STATUS = 404; diff --git a/packages/constants/package.json b/packages/constants/package.json index 7c7d615f1c52fb0bbc8c440954cf3099dc916ab7..c3eaa22713d7451603c7dfe1d377cfcb96bcb1b8 100755 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-constants", - "version": "1.7.9", + "version": "1.8.0", "description": "All the share constants for json:ql tools", "main": "index.js", "module": "main.js", @@ -25,6 +25,10 @@ "type": "git", "url": "git+ssh://git@gitee.com:to1source/jsonql.git" }, + "homepage": "https://jsonql.js.org", + "bugs": { + "url": "https://gitee.com/to1source/jsonql/issues" + }, "devDependencies": { "fs-extra": "^8.1.0" }, diff --git a/packages/contract-console-ts/.gitignore b/packages/contract-console-ts/.gitignore deleted file mode 100644 index a0dddc6fb8c6b3feeeffa6e29bedca338e483382..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -node_modules -/dist - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/packages/contract-console-ts/README.md b/packages/contract-console-ts/README.md deleted file mode 100644 index ab6fc40a3566105105000eebadfcc5043e6b8210..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# contract-console - -## Project setup -``` -npm install -``` - -### Compiles and hot-reloads for development -``` -npm run serve -``` - -### Compiles and minifies for production -``` -npm run build -``` - -### Run your tests -``` -npm run test -``` - -### Lints and fixes files -``` -npm run lint -``` - -### Run your unit tests -``` -npm run test:unit -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/packages/contract-console-ts/babel.config.js b/packages/contract-console-ts/babel.config.js deleted file mode 100644 index ba179669a123909a9728283fd9c004c65adb90c5..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/app' - ] -} diff --git a/packages/contract-console-ts/output.js b/packages/contract-console-ts/output.js deleted file mode 100644 index afc573d8358c6f65144dec30325025eb09e209af..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/output.js +++ /dev/null @@ -1,1209 +0,0 @@ -{ - mode: 'development', - context: '/home/joel/projects/open-source/jsonql/packages/contract-console', - devtool: 'cheap-module-eval-source-map', - node: { - setImmediate: false, - dgram: 'empty', - fs: 'empty', - net: 'empty', - tls: 'empty', - child_process: 'empty' - }, - output: { - path: '/home/joel/projects/open-source/jsonql/packages/contract-console/dist', - filename: '[name].js', - publicPath: '/', - globalObject: '(typeof self !== \'undefined\' ? self : this)' - }, - resolve: { - alias: { - '@': '/home/joel/projects/open-source/jsonql/packages/contract-console/src', - vue$: 'vue/dist/vue.runtime.esm.js' - }, - extensions: [ - '.mjs', - '.js', - '.jsx', - '.vue', - '.json', - '.wasm', - '.ts', - '.tsx' - ], - modules: [ - 'node_modules', - '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules', - '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/@vue/cli-service/node_modules' - ] - }, - resolveLoader: { - modules: [ - '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/@vue/cli-plugin-typescript/node_modules', - '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/@vue/cli-plugin-babel/node_modules', - 'node_modules', - '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules', - '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/@vue/cli-service/node_modules' - ] - }, - module: { - noParse: /^(vue|vue-router|vuex|vuex-router-sync)$/, - rules: [ - /* config.module.rule('vue') */ - { - test: /\.vue$/, - use: [ - /* config.module.rule('vue').use('cache-loader') */ - { - loader: 'cache-loader', - options: { - cacheDirectory: '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/.cache/vue-loader', - cacheIdentifier: '1255578f' - } - }, - /* config.module.rule('vue').use('vue-loader') */ - { - loader: 'vue-loader', - options: { - compilerOptions: { - preserveWhitespace: false - }, - cacheDirectory: '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/.cache/vue-loader', - cacheIdentifier: '1255578f' - } - } - ] - }, - /* config.module.rule('images') */ - { - test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, - use: [ - /* config.module.rule('images').use('url-loader') */ - { - loader: 'url-loader', - options: { - limit: 4096, - fallback: { - loader: 'file-loader', - options: { - name: 'img/[name].[hash:8].[ext]' - } - } - } - } - ] - }, - /* config.module.rule('svg') */ - { - test: /\.(svg)(\?.*)?$/, - use: [ - /* config.module.rule('svg').use('file-loader') */ - { - loader: 'file-loader', - options: { - name: 'img/[name].[hash:8].[ext]' - } - } - ] - }, - /* config.module.rule('media') */ - { - test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, - use: [ - /* config.module.rule('media').use('url-loader') */ - { - loader: 'url-loader', - options: { - limit: 4096, - fallback: { - loader: 'file-loader', - options: { - name: 'media/[name].[hash:8].[ext]' - } - } - } - } - ] - }, - /* config.module.rule('fonts') */ - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i, - use: [ - /* config.module.rule('fonts').use('url-loader') */ - { - loader: 'url-loader', - options: { - limit: 4096, - fallback: { - loader: 'file-loader', - options: { - name: 'fonts/[name].[hash:8].[ext]' - } - } - } - } - ] - }, - /* config.module.rule('pug') */ - { - test: /\.pug$/, - oneOf: [ - /* config.module.rule('pug').oneOf('pug-vue') */ - { - resourceQuery: /vue/, - use: [ - /* config.module.rule('pug').oneOf('pug-vue').use('pug-plain-loader') */ - { - loader: 'pug-plain-loader' - } - ] - }, - /* config.module.rule('pug').oneOf('pug-template') */ - { - use: [ - /* config.module.rule('pug').oneOf('pug-template').use('raw') */ - { - loader: 'raw-loader' - }, - /* config.module.rule('pug').oneOf('pug-template').use('pug-plain') */ - { - loader: 'pug-plain-loader' - } - ] - } - ] - }, - /* config.module.rule('css') */ - { - test: /\.css$/, - oneOf: [ - /* config.module.rule('css').oneOf('vue-modules') */ - { - resourceQuery: /module/, - use: [ - /* config.module.rule('css').oneOf('vue-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('css').oneOf('vue-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('css').oneOf('vue-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('css').oneOf('vue') */ - { - resourceQuery: /\?vue/, - use: [ - /* config.module.rule('css').oneOf('vue').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('css').oneOf('vue').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('css').oneOf('vue').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('css').oneOf('normal-modules') */ - { - test: /\.module\.\w+$/, - use: [ - /* config.module.rule('css').oneOf('normal-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('css').oneOf('normal-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('css').oneOf('normal-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('css').oneOf('normal') */ - { - use: [ - /* config.module.rule('css').oneOf('normal').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('css').oneOf('normal').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('css').oneOf('normal').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - } - ] - }, - /* config.module.rule('postcss') */ - { - test: /\.p(ost)?css$/, - oneOf: [ - /* config.module.rule('postcss').oneOf('vue-modules') */ - { - resourceQuery: /module/, - use: [ - /* config.module.rule('postcss').oneOf('vue-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('postcss').oneOf('vue-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('postcss').oneOf('vue-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('postcss').oneOf('vue') */ - { - resourceQuery: /\?vue/, - use: [ - /* config.module.rule('postcss').oneOf('vue').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('postcss').oneOf('vue').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('postcss').oneOf('vue').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('postcss').oneOf('normal-modules') */ - { - test: /\.module\.\w+$/, - use: [ - /* config.module.rule('postcss').oneOf('normal-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('postcss').oneOf('normal-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('postcss').oneOf('normal-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('postcss').oneOf('normal') */ - { - use: [ - /* config.module.rule('postcss').oneOf('normal').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('postcss').oneOf('normal').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('postcss').oneOf('normal').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - } - ] - } - ] - }, - /* config.module.rule('scss') */ - { - test: /\.scss$/, - oneOf: [ - /* config.module.rule('scss').oneOf('vue-modules') */ - { - resourceQuery: /module/, - use: [ - /* config.module.rule('scss').oneOf('vue-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('scss').oneOf('vue-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('scss').oneOf('vue-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('scss').oneOf('vue-modules').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('scss').oneOf('vue') */ - { - resourceQuery: /\?vue/, - use: [ - /* config.module.rule('scss').oneOf('vue').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('scss').oneOf('vue').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('scss').oneOf('vue').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('scss').oneOf('vue').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('scss').oneOf('normal-modules') */ - { - test: /\.module\.\w+$/, - use: [ - /* config.module.rule('scss').oneOf('normal-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('scss').oneOf('normal-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('scss').oneOf('normal-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('scss').oneOf('normal-modules').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('scss').oneOf('normal') */ - { - use: [ - /* config.module.rule('scss').oneOf('normal').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('scss').oneOf('normal').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('scss').oneOf('normal').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('scss').oneOf('normal').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false - } - } - ] - } - ] - }, - /* config.module.rule('sass') */ - { - test: /\.sass$/, - oneOf: [ - /* config.module.rule('sass').oneOf('vue-modules') */ - { - resourceQuery: /module/, - use: [ - /* config.module.rule('sass').oneOf('vue-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('sass').oneOf('vue-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('sass').oneOf('vue-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('sass').oneOf('vue-modules').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false, - indentedSyntax: true - } - } - ] - }, - /* config.module.rule('sass').oneOf('vue') */ - { - resourceQuery: /\?vue/, - use: [ - /* config.module.rule('sass').oneOf('vue').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('sass').oneOf('vue').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('sass').oneOf('vue').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('sass').oneOf('vue').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false, - indentedSyntax: true - } - } - ] - }, - /* config.module.rule('sass').oneOf('normal-modules') */ - { - test: /\.module\.\w+$/, - use: [ - /* config.module.rule('sass').oneOf('normal-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('sass').oneOf('normal-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('sass').oneOf('normal-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('sass').oneOf('normal-modules').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false, - indentedSyntax: true - } - } - ] - }, - /* config.module.rule('sass').oneOf('normal') */ - { - use: [ - /* config.module.rule('sass').oneOf('normal').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('sass').oneOf('normal').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('sass').oneOf('normal').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('sass').oneOf('normal').use('sass-loader') */ - { - loader: 'sass-loader', - options: { - sourceMap: false, - indentedSyntax: true - } - } - ] - } - ] - }, - /* config.module.rule('less') */ - { - test: /\.less$/, - oneOf: [ - /* config.module.rule('less').oneOf('vue-modules') */ - { - resourceQuery: /module/, - use: [ - /* config.module.rule('less').oneOf('vue-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('less').oneOf('vue-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('less').oneOf('vue-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('less').oneOf('vue-modules').use('less-loader') */ - { - loader: 'less-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('less').oneOf('vue') */ - { - resourceQuery: /\?vue/, - use: [ - /* config.module.rule('less').oneOf('vue').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('less').oneOf('vue').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('less').oneOf('vue').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('less').oneOf('vue').use('less-loader') */ - { - loader: 'less-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('less').oneOf('normal-modules') */ - { - test: /\.module\.\w+$/, - use: [ - /* config.module.rule('less').oneOf('normal-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('less').oneOf('normal-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('less').oneOf('normal-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('less').oneOf('normal-modules').use('less-loader') */ - { - loader: 'less-loader', - options: { - sourceMap: false - } - } - ] - }, - /* config.module.rule('less').oneOf('normal') */ - { - use: [ - /* config.module.rule('less').oneOf('normal').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('less').oneOf('normal').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('less').oneOf('normal').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('less').oneOf('normal').use('less-loader') */ - { - loader: 'less-loader', - options: { - sourceMap: false - } - } - ] - } - ] - }, - /* config.module.rule('stylus') */ - { - test: /\.styl(us)?$/, - oneOf: [ - /* config.module.rule('stylus').oneOf('vue-modules') */ - { - resourceQuery: /module/, - use: [ - /* config.module.rule('stylus').oneOf('vue-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('stylus').oneOf('vue-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('stylus').oneOf('vue-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('stylus').oneOf('vue-modules').use('stylus-loader') */ - { - loader: 'stylus-loader', - options: { - sourceMap: false, - preferPathResolver: 'webpack' - } - } - ] - }, - /* config.module.rule('stylus').oneOf('vue') */ - { - resourceQuery: /\?vue/, - use: [ - /* config.module.rule('stylus').oneOf('vue').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('stylus').oneOf('vue').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('stylus').oneOf('vue').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('stylus').oneOf('vue').use('stylus-loader') */ - { - loader: 'stylus-loader', - options: { - sourceMap: false, - preferPathResolver: 'webpack' - } - } - ] - }, - /* config.module.rule('stylus').oneOf('normal-modules') */ - { - test: /\.module\.\w+$/, - use: [ - /* config.module.rule('stylus').oneOf('normal-modules').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('stylus').oneOf('normal-modules').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2, - modules: true, - localIdentName: '[name]_[local]_[hash:base64:5]' - } - }, - /* config.module.rule('stylus').oneOf('normal-modules').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('stylus').oneOf('normal-modules').use('stylus-loader') */ - { - loader: 'stylus-loader', - options: { - sourceMap: false, - preferPathResolver: 'webpack' - } - } - ] - }, - /* config.module.rule('stylus').oneOf('normal') */ - { - use: [ - /* config.module.rule('stylus').oneOf('normal').use('vue-style-loader') */ - { - loader: 'vue-style-loader', - options: { - sourceMap: false, - shadowMode: false - } - }, - /* config.module.rule('stylus').oneOf('normal').use('css-loader') */ - { - loader: 'css-loader', - options: { - sourceMap: false, - importLoaders: 2 - } - }, - /* config.module.rule('stylus').oneOf('normal').use('postcss-loader') */ - { - loader: 'postcss-loader', - options: { - sourceMap: false - } - }, - /* config.module.rule('stylus').oneOf('normal').use('stylus-loader') */ - { - loader: 'stylus-loader', - options: { - sourceMap: false, - preferPathResolver: 'webpack' - } - } - ] - } - ] - }, - /* config.module.rule('js') */ - { - test: /\.m?jsx?$/, - exclude: [ - function () { /* omitted long function */ } - ], - use: [ - /* config.module.rule('js').use('cache-loader') */ - { - loader: 'cache-loader', - options: { - cacheDirectory: '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/.cache/babel-loader', - cacheIdentifier: '2835135d' - } - }, - /* config.module.rule('js').use('babel-loader') */ - { - loader: 'babel-loader' - } - ] - }, - /* config.module.rule('ts') */ - { - test: /\.ts$/, - use: [ - /* config.module.rule('ts').use('cache-loader') */ - { - loader: 'cache-loader', - options: { - cacheDirectory: '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/.cache/ts-loader', - cacheIdentifier: '79086cb7' - } - }, - /* config.module.rule('ts').use('babel-loader') */ - { - loader: 'babel-loader' - }, - /* config.module.rule('ts').use('ts-loader') */ - { - loader: 'ts-loader', - options: { - transpileOnly: true, - appendTsSuffixTo: [ - '\\.vue$' - ], - happyPackMode: false - } - } - ] - }, - /* config.module.rule('tsx') */ - { - test: /\.tsx$/, - use: [ - /* config.module.rule('tsx').use('cache-loader') */ - { - loader: 'cache-loader', - options: { - cacheDirectory: '/home/joel/projects/open-source/jsonql/packages/contract-console/node_modules/.cache/ts-loader', - cacheIdentifier: '79086cb7' - } - }, - /* config.module.rule('tsx').use('babel-loader') */ - { - loader: 'babel-loader' - }, - /* config.module.rule('tsx').use('ts-loader') */ - { - loader: 'ts-loader', - options: { - transpileOnly: true, - happyPackMode: false, - appendTsxSuffixTo: [ - '\\.vue$' - ] - } - } - ] - } - ] - }, - plugins: [ - /* config.plugin('vue-loader') */ - new VueLoaderPlugin(), - /* config.plugin('define') */ - new DefinePlugin( - { - 'process.env': { - NODE_ENV: '"development"', - BASE_URL: '"/"' - } - } - ), - /* config.plugin('case-sensitive-paths') */ - new CaseSensitivePathsPlugin(), - /* config.plugin('friendly-errors') */ - new FriendlyErrorsWebpackPlugin( - { - additionalTransformers: [ - function () { /* omitted long function */ } - ], - additionalFormatters: [ - function () { /* omitted long function */ } - ] - } - ), - /* config.plugin('hmr') */ - new HotModuleReplacementPlugin(), - /* config.plugin('progress') */ - new ProgressPlugin(), - /* config.plugin('html') */ - new HtmlWebpackPlugin( - { - templateParameters: function () { /* omitted long function */ }, - template: '/home/joel/projects/open-source/jsonql/packages/contract-console/public/index.html' - } - ), - /* config.plugin('preload') */ - new PreloadPlugin( - { - rel: 'preload', - include: 'initial', - fileBlacklist: [ - /\.map$/, - /hot-update\.js$/ - ] - } - ), - /* config.plugin('prefetch') */ - new PreloadPlugin( - { - rel: 'prefetch', - include: 'asyncChunks' - } - ), - /* config.plugin('copy') */ - new CopyWebpackPlugin( - [ - { - from: '/home/joel/projects/open-source/jsonql/packages/contract-console/public', - to: '/home/joel/projects/open-source/jsonql/packages/contract-console/dist', - toType: 'dir', - ignore: [ - '.DS_Store' - ] - } - ] - ), - /* config.plugin('fork-ts-checker') */ - new ForkTsCheckerWebpackPlugin( - { - vue: true, - tslint: false, - formatter: 'codeframe', - checkSyntacticErrors: false - } - ) - ], - entry: { - app: [ - './src/main.ts' - ] - } -} diff --git a/packages/contract-console-ts/package.json b/packages/contract-console-ts/package.json deleted file mode 100644 index 8258587eebabb83a5a61822e73e0cce4f807a44a..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "contract-console", - "version": "0.1.0", - "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint", - "test:unit": "vue-cli-service test:unit", - "be": "node ./tests/fixtures/server.js", - "dev": "npm run be & npm run serve" - }, - "dependencies": { - "@types/debug": "^4.1.4", - "core-js": "^3.1.4", - "debug": "^4.1.1", - "flyio": "^0.6.14", - "vue": "^2.6.10", - "vue-class-component": "^7.1.0", - "vue-property-decorator": "^8.2.1", - "vuex": "^3.1.1" - }, - "devDependencies": { - "@types/chai": "^4.1.7", - "@types/mocha": "^5.2.7", - "@vue/cli-plugin-babel": "^3.9.2", - "@vue/cli-plugin-typescript": "^3.9.0", - "@vue/cli-plugin-unit-mocha": "^3.9.0", - "@vue/cli-service": "^3.9.3", - "@vue/test-utils": "1.0.0-beta.29", - "chai": "^4.2.0", - "jsonql-client": "^1.2.4", - "jsonql-koa": "^1.3.4", - "lint-staged": "^9.2.1", - "server-io-core": "^1.2.0-beta.2", - "typescript": "^3.5.3", - "vue-template-compiler": "^2.6.10" - }, - "postcss": { - "plugins": { - "autoprefixer": {} - } - }, - "browserslist": [ - "> 1%", - "last 2 versions" - ], - "gitHooks": { - "pre-commit": "lint-staged" - }, - "lint-staged": { - "*.ts": [ - "vue-cli-service lint", - "git add" - ], - "*.vue": [ - "vue-cli-service lint", - "git add" - ] - } -} diff --git a/packages/contract-console-ts/public/favicon.ico b/packages/contract-console-ts/public/favicon.ico deleted file mode 100644 index df36fcfb72584e00488330b560ebcf34a41c64c2..0000000000000000000000000000000000000000 Binary files a/packages/contract-console-ts/public/favicon.ico and /dev/null differ diff --git a/packages/contract-console-ts/public/index.html b/packages/contract-console-ts/public/index.html deleted file mode 100644 index 3780d6eeeaec6ad9240f2ac88a807a9205c3d607..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/public/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - contract-console development - - - -
- - - diff --git a/packages/contract-console-ts/src/App.vue b/packages/contract-console-ts/src/App.vue deleted file mode 100644 index 763361681d515778e3fbb9827429569817afa55d..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/App.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/packages/contract-console-ts/src/assets/logo.png b/packages/contract-console-ts/src/assets/logo.png deleted file mode 100644 index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..0000000000000000000000000000000000000000 Binary files a/packages/contract-console-ts/src/assets/logo.png and /dev/null differ diff --git a/packages/contract-console-ts/src/components/HelloWorld.vue b/packages/contract-console-ts/src/components/HelloWorld.vue deleted file mode 100644 index 7a6c0bb3ced2b286b5681fb36816631892b6cb27..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/components/HelloWorld.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - diff --git a/packages/contract-console-ts/src/main.ts b/packages/contract-console-ts/src/main.ts deleted file mode 100644 index a69772e284abc4f45110d5d8c9183bdc155e854d..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/main.ts +++ /dev/null @@ -1,11 +0,0 @@ - -import Vue from 'vue'; -import App from './App.vue'; -import store from './store'; - -Vue.config.productionTip = false; - -new Vue({ - store, - render: (h) => h(App), -}).$mount('#app'); diff --git a/packages/contract-console-ts/src/plugin/client.ts b/packages/contract-console-ts/src/plugin/client.ts deleted file mode 100644 index 845961f66cac62d152ed329c738297923071a158..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/plugin/client.ts +++ /dev/null @@ -1,14 +0,0 @@ - -import Fly from 'flyio/dist/npm/fly' -import jsonqlClient from 'jsonql-client' - -const createClient = async (contract: any, options: any) => await jsonqlClient( - Object.assign({ - hostname: 'http://localhost:8080', - keepContract: false, - showContractDesc: true, - contract - }, options) -) - -export default createClient diff --git a/packages/contract-console-ts/src/plugin/jsonql.ts b/packages/contract-console-ts/src/plugin/jsonql.ts deleted file mode 100644 index 30322b97cf174872fcff133f0717c6ca9c44dea1..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/plugin/jsonql.ts +++ /dev/null @@ -1,10 +0,0 @@ - -import contract from './public-contract.json' - -import client from './client' - -export default { - install(Vue: any, options: any = {}) { - Vue.JsonqlClient = client(contract, options) - } -} diff --git a/packages/contract-console-ts/src/plugin/public-contract.json b/packages/contract-console-ts/src/plugin/public-contract.json deleted file mode 100644 index c7808b85dd107461dbde05cacbebb7de39147319..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/plugin/public-contract.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "query": { - "helloWorld": { - "description": "This is the stock resolver for testing purpose", - "params": [], - "returns": [ - { - "type": "string", - "description": "stock message" - } - ] - }, - "defaultCall": { - "description": false, - "params": [ - { - "type": [ - "number" - ], - "description": "a phony id", - "name": "id" - } - ], - "returns": [ - { - "type": [ - "object" - ], - "description": "an object with whatever" - } - ] - } - }, - "mutation": { - "defaultSave": { - "description": false, - "params": [ - { - "type": [ - "object" - ], - "name": "payload" - }, - { - "type": [ - "object" - ], - "name": "condition" - } - ], - "returns": [ - { - "type": [ - "boolean" - ] - } - ] - } - }, - "auth": {}, - "timestamp": 1563798679 -} diff --git a/packages/contract-console-ts/src/shims-tsx.d.ts b/packages/contract-console-ts/src/shims-tsx.d.ts deleted file mode 100644 index 3b88b58292fa668f5f84089a7960dc9a826d96ff..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/shims-tsx.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Vue, { VNode } from 'vue'; - -declare global { - namespace JSX { - // tslint:disable no-empty-interface - interface Element extends VNode {} - // tslint:disable no-empty-interface - interface ElementClass extends Vue {} - interface IntrinsicElements { - [elem: string]: any; - } - } -} diff --git a/packages/contract-console-ts/src/shims-vue.d.ts b/packages/contract-console-ts/src/shims-vue.d.ts deleted file mode 100644 index 8f6f4102637123d7e5696be9ff5776d810334a90..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/shims-vue.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.vue' { - import Vue from 'vue'; - export default Vue; -} diff --git a/packages/contract-console-ts/src/store.ts b/packages/contract-console-ts/src/store.ts deleted file mode 100644 index fead3eaf2585b453533ebe2c2d1ae4a4af61de3e..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/src/store.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; -import JsonqlClient from './plugin/jsonql' - -Vue.use(Vuex) -Vue.use(JsonqlClient) - -export default new Vuex.Store({ - state: { - - }, - mutations: { - - }, - actions: { - - }, -}); diff --git a/packages/contract-console-ts/tests/fixtures/contract/contract.json b/packages/contract-console-ts/tests/fixtures/contract/contract.json deleted file mode 100644 index cb069393ef61930092e53abf325137b2055513de..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/contract/contract.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "query": { - "defaultCall": { - "file": "/home/joel/projects/open-source/jsonql/packages/contract-console/tests/fixtures/resolvers/query/default-call.js", - "description": false, - "params": [ - { - "type": [ - "number" - ], - "description": "a phony id", - "name": "id" - } - ], - "returns": [ - { - "type": [ - "object" - ], - "description": "an object with whatever" - } - ] - } - }, - "mutation": { - "defaultSave": { - "file": "/home/joel/projects/open-source/jsonql/packages/contract-console/tests/fixtures/resolvers/mutation/default-save.js", - "description": false, - "params": [ - { - "type": [ - "object" - ], - "name": "payload" - }, - { - "type": [ - "object" - ], - "name": "condition" - } - ], - "returns": [ - { - "type": [ - "boolean" - ] - } - ] - } - }, - "auth": {}, - "timestamp": 1563798679, - "sourceType": "module" -} diff --git a/packages/contract-console-ts/tests/fixtures/contract/public-contract.json b/packages/contract-console-ts/tests/fixtures/contract/public-contract.json deleted file mode 100644 index c7808b85dd107461dbde05cacbebb7de39147319..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/contract/public-contract.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "query": { - "helloWorld": { - "description": "This is the stock resolver for testing purpose", - "params": [], - "returns": [ - { - "type": "string", - "description": "stock message" - } - ] - }, - "defaultCall": { - "description": false, - "params": [ - { - "type": [ - "number" - ], - "description": "a phony id", - "name": "id" - } - ], - "returns": [ - { - "type": [ - "object" - ], - "description": "an object with whatever" - } - ] - } - }, - "mutation": { - "defaultSave": { - "description": false, - "params": [ - { - "type": [ - "object" - ], - "name": "payload" - }, - { - "type": [ - "object" - ], - "name": "condition" - } - ], - "returns": [ - { - "type": [ - "boolean" - ] - } - ] - } - }, - "auth": {}, - "timestamp": 1563798679 -} diff --git a/packages/contract-console-ts/tests/fixtures/resolvers/import.js b/packages/contract-console-ts/tests/fixtures/resolvers/import.js deleted file mode 100644 index 6601f782c3497ae953db86928e4e6e922da04a10..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/resolvers/import.js +++ /dev/null @@ -1,2 +0,0 @@ -require = require("esm")(module/*, options*/) -module.exports = require("./resolver.js") diff --git a/packages/contract-console-ts/tests/fixtures/resolvers/mutation/default-save.js b/packages/contract-console-ts/tests/fixtures/resolvers/mutation/default-save.js deleted file mode 100644 index e307c3e96edc7a8c0e7bb685e4bc28ecf888e473..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/resolvers/mutation/default-save.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @param {object} payload - * @param {object} condition - * @return {boolean} - */ -export default function defaultSave(payload, condition) { - - - return true; -} diff --git a/packages/contract-console-ts/tests/fixtures/resolvers/query/default-call.js b/packages/contract-console-ts/tests/fixtures/resolvers/query/default-call.js deleted file mode 100644 index 32c8211fc3f7c85a14c9e009ab65bd12712e0ed1..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/resolvers/query/default-call.js +++ /dev/null @@ -1,10 +0,0 @@ - -/** - * @param {number} id a phony id - * @return {object} an object with whatever - * - */ -export default function defaultCall(id) { - - return {id: id} -} diff --git a/packages/contract-console-ts/tests/fixtures/resolvers/resolver.js b/packages/contract-console-ts/tests/fixtures/resolvers/resolver.js deleted file mode 100644 index 547fa7565ffdf294d16e4ae924c6bce10877c2ca..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/resolvers/resolver.js +++ /dev/null @@ -1,7 +0,0 @@ -import querydefaultCall from './query/default-call.js' -import mutationdefaultSave from './mutation/default-save.js' - -export { - querydefaultCall, -mutationdefaultSave -} \ No newline at end of file diff --git a/packages/contract-console-ts/tests/fixtures/server.js b/packages/contract-console-ts/tests/fixtures/server.js deleted file mode 100644 index 42661c5530f6b35594b606198aab024987c6b444..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/fixtures/server.js +++ /dev/null @@ -1,21 +0,0 @@ -const serverIo = require('server-io-core') -const jsonqlKoa = require('jsonql-koa') -const { join } = require('path') -const baseDir = join(__dirname, '..', '..') - -serverIo({ - port: 8001, - open: false, - webroot: [ - join(baseDir, 'node_modules'), - join(baseDir, 'public') - ], - middlewares: [ - jsonqlKoa({ - jsType: 'es', - resolverDir: join(__dirname, 'resolvers'), - contractDir: join(__dirname, 'contract'), - keysDir: join(__dirname, 'keys') - }) - ] -}) diff --git a/packages/contract-console-ts/tests/jsonql-client.d.ts b/packages/contract-console-ts/tests/jsonql-client.d.ts deleted file mode 100644 index 21e38b099e8d1258913420f05b384e35e2c23280..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/jsonql-client.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -// create our own type for jsonql-client - -declare module "jsonql-client" { - function jsonqlApi(config: any): any; - export = jsonqlApi; -} diff --git a/packages/contract-console-ts/tests/unit/example.spec.ts b/packages/contract-console-ts/tests/unit/example.spec.ts deleted file mode 100644 index 732a277ae83f4ce8bfe76b004045bf48646dc75f..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tests/unit/example.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { expect } from 'chai'; -import { shallowMount } from '@vue/test-utils'; -import HelloWorld from '@/components/HelloWorld.vue'; - -describe('HelloWorld.vue', () => { - it('renders props.msg when passed', () => { - const msg = 'new message'; - const wrapper = shallowMount(HelloWorld, { - propsData: { msg }, - }); - expect(wrapper.text()).to.include(msg); - }); -}); diff --git a/packages/contract-console-ts/tsconfig.json b/packages/contract-console-ts/tsconfig.json deleted file mode 100644 index 977717422085f215cb18459b0e33f36b562387d3..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tsconfig.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "esnext", - "strict": true, - "jsx": "preserve", - "importHelpers": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "sourceMap": true, - "baseUrl": ".", - "types": [ - "webpack-env", - "mocha", - "chai" - ], - "paths": { - "@/*": [ - "src/*" - ] - }, - "lib": [ - "esnext", - "dom", - "dom.iterable", - "scripthost" - ] - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "src/**/*.vue", - "tests/**/*.ts", - "tests/**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/packages/contract-console-ts/tslint.json b/packages/contract-console-ts/tslint.json deleted file mode 100644 index 2b37e401c3d6d00ca253ca75a0b602ebe886e6ea..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/tslint.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "defaultSeverity": "warning", - "extends": [ - "tslint:recommended" - ], - "linterOptions": { - "exclude": [ - "node_modules/**" - ] - }, - "rules": { - "quotemark": [true, "single"], - "indent": [true, "spaces", 2], - "interface-name": false, - "ordered-imports": false, - "object-literal-sort-keys": false, - "no-consecutive-blank-lines": false - } -} diff --git a/packages/contract-console-ts/vue.config.js b/packages/contract-console-ts/vue.config.js deleted file mode 100644 index fdddb55b25f0f1ded226095f7b4eff1a87716ec6..0000000000000000000000000000000000000000 --- a/packages/contract-console-ts/vue.config.js +++ /dev/null @@ -1,20 +0,0 @@ -// add a copy contract here -const fsx = require('fs-extra') -const { join } = require('path') -fsx.copy( - join(__dirname, 'tests', 'fixtures', 'contract', 'public-contract.json'), - join(__dirname, 'src', 'plugin', 'public-contract.json') -) - -module.exports = { - lintOnSave: false, - devServer: { - open: true, - proxy: { - '^/jsonql': { - target: "http://localhost:8001", - ws: true - } - } - } -} diff --git a/packages/koa/src/lib/config-check/options.js b/packages/koa/src/lib/config-check/options.js index 987cae0641898c99e05eaef9d286465de376c058..e423dd7435b5c66a1d90d91f78d7bacf3eece440 100755 --- a/packages/koa/src/lib/config-check/options.js +++ b/packages/koa/src/lib/config-check/options.js @@ -27,14 +27,17 @@ const { DEFAULT_PUBLIC_KEY_FILE, DEFAULT_PRIVATE_KEY_FILE, RSA_MIN_MODULE_LEN -} = require('jsonql-constants'); -const { createConfig, constructConfig } = require('jsonql-params-validator'); +} = require('jsonql-constants') +const { + createConfig, + constructConfig +} = require('jsonql-params-validator') // const NodeCache = require('node-cache'); // const mcache = new NodeCache; // @BUG when we deploy it in docker, or using systemd the workingDirectory affect the // execute path, it might be better to allow a config option of workingDirectory and // use that as base -const dirname = process.cwd(); +const dirname = process.cwd() // @TODO we need to create the same fn to clear out the options like I did in server-io-core const constProps = { __checked__: true, @@ -46,7 +49,7 @@ const constProps = { privateKey: false, publicKey: false, initJwtKeys: false -}; +} const appProps = { name: createConfig('jsonql-koa', [STRING_TYPE]), // this is for ID which one is which when use as ms @@ -91,7 +94,7 @@ const appProps = { jsType: {[ARGS_KEY]: CJS_TYPE, [TYPE_KEY]: STRING_TYPE, [ENUM_KEY]: ACCEPTED_JS_TYPES}, // undecided properties - clientConfig: {[ARGS_KEY]: [], [TYPE_KEY]: ARRAY_TYPE}, // need to develop a new tool to validate and inject this + // clientConfig: {[ARGS_KEY]: [], [TYPE_KEY]: ARRAY_TYPE}, // need to develop a new tool to validate and inject this exposeError: {[ARGS_KEY]: false, [TYPE_KEY]: BOOLEAN_TYPE}, // this will allow you to control if you want to throw your error back to your client // Perhaps I should build the same create options style like server-io-core diff --git a/packages/node-client/src/jsonql/jsonql-cache-class.js b/packages/node-client/src/jsonql/jsonql-cache-class.js index 7bf1f8cb403e34ecd470c008875049bc36fef85e..06c264efbca2755f75035866cb33d464c21e7cc6 100644 --- a/packages/node-client/src/jsonql/jsonql-cache-class.js +++ b/packages/node-client/src/jsonql/jsonql-cache-class.js @@ -1,17 +1,31 @@ // using node-cache for storage +// @2019-08-25 we use the hostname as the base key then store the +// data associate with this particular object +const merge = require('lodash.merge') const NodeCache = require('node-cache') class JsonqlCacheClass { - constructor() { + constructor(config) { this.nc = new NodeCache() + this.ncBaseKey = config.hostname; + } + + get baseCacheObj() { + return this.nc.get(this.ncBaseKey) + } + + set baseCacheObj(values) { + this.nc.set(this.ncBaseKey, values) } getter(key) { - return this.nc.get(key) + let obj = this.baseCacheObj; + return (key in obj) ? obj[key] : false } setter(key, value) { - return this.nc.set(key,value) + let obj = this.baseCacheObj; + this.baseCacheObj = merge(obj, {[key]: value}) } } diff --git a/packages/node-client/tests/auth.test.js b/packages/node-client/tests/auth.test.js index 1adb4e876808e2f4fa42bc3965b3d4d6fc6eaa3e..8fc7432e6090451045a61d7ec25d6846139a990f 100755 --- a/packages/node-client/tests/auth.test.js +++ b/packages/node-client/tests/auth.test.js @@ -11,7 +11,7 @@ const { contractKey, loginToken, token } = require('./fixtures/options') const { JsonqlAuthorisationError } = require('jsonql-errors') test.before(async (t) => { - const { stop } = await server(); + const { stop } = await server() t.context.stop = stop; const client = await nodeClient({ @@ -19,13 +19,13 @@ test.before(async (t) => { enableAuth: true, contractDir, contractKey - }); + }) t.context.client = client; }) test.after(t => { - t.context.stop(); + t.context.stop() }) test('Testing the login function', async (t) => { @@ -43,6 +43,7 @@ test("Try a wrong password and cause the server to throw error", async t => { client.login('wrong-password') .catch(err => { t.true(err.className === 'JsonqlAuthorisationError') - }); - + }) }) + +test.todo(`Test if the loggin client token is persist`) diff --git a/packages/util/README.md b/packages/utils/README.md similarity index 100% rename from packages/util/README.md rename to packages/utils/README.md diff --git a/packages/utils/index.js b/packages/utils/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8e2ff9534c624699f1f4e86f4f40ee705fbf5db4 --- /dev/null +++ b/packages/utils/index.js @@ -0,0 +1,12 @@ +// exportfor ES modules +// ported from jsonql-params-validator + +import { chainFns, chainPromises } from './src/chain-fns' + + +// exports +export { + // chain-fns + chainFns, + chainPromises +} diff --git a/packages/utils/main.js b/packages/utils/main.js new file mode 100644 index 0000000000000000000000000000000000000000..188245a229d0ee6d6c685eaed77232af23df0cc9 --- /dev/null +++ b/packages/utils/main.js @@ -0,0 +1,3 @@ +// export for CJS modules using esm modules +require = require('esm')(module) +module.exports = require('./index.js') diff --git a/packages/util/package.json b/packages/utils/package.json similarity index 62% rename from packages/util/package.json rename to packages/utils/package.json index fad2b757e136d75d6435586c91be3ecfcc02769a..81c989e4f52dd079adf92abacbc531605fa723b4 100644 --- a/packages/util/package.json +++ b/packages/utils/package.json @@ -1,10 +1,12 @@ { - "name": "jsonql-util", - "version": "1.0.0-beta", + "name": "jsonql-utils", + "version": "1.0.0", "description": "This is not for generate use, it's for jsonql various modules", - "main": "index.js", + "main": "main.js", + "module": "index.js", "scripts": { - "test": "ava" + "test": "ava", + "test:params": "DEBUG=jsonql* ava ./tests/params-api.test.js" }, "keywords": [ "jsonql", @@ -32,5 +34,15 @@ "failWithoutAssertions": false, "tap": false, "compileEnhancements": false + }, + "dependencies": { + "debug": "^4.1.1", + "esm": "^3.2.25", + "jsonql-constants": "^1.7.9", + "jsonql-errors": "^1.1.2", + "lodash-es": "^4.17.15" + }, + "devDependencies": { + "ava": "^2.3.0" } } diff --git a/packages/utils/src/chain-fns.js b/packages/utils/src/chain-fns.js new file mode 100644 index 0000000000000000000000000000000000000000..d9ad6c9b384fb7774899ce5a76f2a3e4d011aa57 --- /dev/null +++ b/packages/utils/src/chain-fns.js @@ -0,0 +1,34 @@ +// break it out on its own because +// it's building from the lodash-es from scratch +// according to this discussion https://github.com/lodash/lodash/issues/3298 + +/** + * using just the map reduce to chain multiple functions together + * @param {function} mainFn the init function + * @param {array} moreFns as many as you want to take the last value and return a new one + * @return {function} accept value for the mainFn + */ +export const chainFns = (mainFn, ...moreFns) => ( + (...args) => ( + moreFns.reduce((value, nextFn) => ( + Reflect.apply(nextFn, null, [value]) + ), Reflect.apply(mainFn, null, args)) + ) +) + + +/** + * previously we already make sure the order of the namespaces + * and attach the auth client to it + * @param {array} promises array of unresolved promises + * @return {object} promise resolved with the array of promises resolved results + */ +export function chainPromises(promises) { + return promises.reduce((promiseChain, currentTask) => ( + promiseChain.then(chainResults => ( + currentTask.then(currentResult => ( + [...chainResults, currentResult] + )) + )) + ), Promise.resolve([])) +} diff --git a/packages/utils/src/contract.js b/packages/utils/src/contract.js new file mode 100644 index 0000000000000000000000000000000000000000..da99ce35cda43f38d6e6eb716ca9f1cd47c11fb4 --- /dev/null +++ b/packages/utils/src/contract.js @@ -0,0 +1,51 @@ +// contract related methods +// This is ported back from ws-server and it will get use in the server / client side +import { isKeyInObject } from './generic' + +/** + * Ported from jsonql-params-validator but different + * if we don't find the socket part then return false + * @param {object} contract the contract object + * @return {object|boolean} false on failed + */ +function extractSocketPart(contract) { + if (isKeyInObject(contract, 'socket')) { + return contract.socket; + } + return false; +} + +/** + * @BUG we should check the socket part instead of expect the downstream to read the menu! + * We only need this when the enableAuth is true otherwise there is only one namespace + * @param {object} contract the socket part of the contract file + * @return {object} 1. remap the contract using the namespace --> resolvers + * 2. the size of the object (1 all private, 2 mixed public with private) + * 3. which namespace is public + */ +export default function groupByNamespace(contract) { + let socket = extractSocketPart(contract) + if (socket === false) { + throw new Error(`socket not found in contract!`) + } + let nspSet = {}; + let size = 0; + let publicNamespace; + for (let resolverName in socket) { + let params = socket[resolverName]; + let { namespace } = params; + if (namespace) { + if (!nspSet[namespace]) { + ++size; + nspSet[namespace] = {}; + } + nspSet[namespace][resolverName] = params; + if (!publicNamespace) { + if (params.public) { + publicNamespace = namespace; + } + } + } + } + return { size, nspSet, publicNamespace } +} diff --git a/packages/utils/src/error.js b/packages/utils/src/error.js new file mode 100644 index 0000000000000000000000000000000000000000..64e894e8ec179eb5a6947337bcefde0f36e3afa3 --- /dev/null +++ b/packages/utils/src/error.js @@ -0,0 +1,35 @@ +// some useful methods for error handling +const { inspect } = require('util') +/** + * Port this from the CIS App + * @param {string} key of object + * @param {mixed} value of object + * @return {string} of things we after + */ +const replaceErrors = function(key, value) { + if (value instanceof Error) { + var error = {}; + Object.getOwnPropertyNames(value).forEach(function (key) { + error[key] = value[key]; + }) + return error; + } + return value; +} + +/** + * create readible string version of the error object + * @param {object} error obj + * @return {string} printable result + */ +const printError = function(error) { + //return 'MASKED'; //error.toString(); + // return JSON.stringify(error, replaceErrors); + return inspect(error, false, null, true) +} + + +module.exports = { + replaceErrors, + printError +} diff --git a/packages/utils/src/generic.js b/packages/utils/src/generic.js new file mode 100644 index 0000000000000000000000000000000000000000..bec690efda61f1ba3d4bb69bfe8400c65a5ef1b6 --- /dev/null +++ b/packages/utils/src/generic.js @@ -0,0 +1,30 @@ +// bunch of generic helpers +import debug from 'debug' +// import * as _ from 'lodash-es' + + +/** + * @param {string} name the name part after the : + * @param {string} baseName the base before the : + */ +export const getDebug = (name, baseName = 'jsonql') => { + debug(baseName).extend(name) +} + +/** + * DIY in Array + * @param {array} arr to check from + * @param {*} value to check against + * @return {boolean} true on found + */ +export const inArray = (arr, value) => !!arr.filter(a => a === value).length; + +/** + * @param {object} obj for search + * @param {string} key target + * @return {boolean} true on success + */ +export const checkKeyInObject = function(obj, key) { + const keys = Object.keys(obj) + return inArray(keys, key) +} diff --git a/packages/utils/src/koa.js b/packages/utils/src/koa.js new file mode 100644 index 0000000000000000000000000000000000000000..d51d7051c606f6b6c0f5f27d8390676b606200c3 --- /dev/null +++ b/packages/utils/src/koa.js @@ -0,0 +1,102 @@ +// koa specific methods +import { CONTENT_TYPE } from 'jsonql-constants' +import jsonqlErrors from 'jsonql-errors' + + + +const SUCCESS_STATE = 200; +const FORBIDDEN_STATE = 403; +/** + * @TODO need to be more flexible + * @param {object} ctx koa + * @param {object} opts configuration + * @return {boolean} if it match + */ +export const isJsonqlPath = (ctx, opts) => ctx.path === opts.jsonqlPath; + +/** + * combine two check in one and save time + * @param {object} ctx koa + * @param {object} opts config + * @return {boolean} check result + */ +export const isJsonqlRequest = (ctx, opts) => { + const header = isHeaderPresent(ctx.request, opts.contentType) + if (header) { + return isJsonqlPath(ctx, opts) + } + return false; +} + +/** + * check if this is point to the jsonql console + * @param {object} ctx koa context + * @param {object} opts config + * @return {boolean} + */ +export const isJsonqlConsoleUrl = (ctx, opts) => ( + ctx.method === 'GET' && isJsonqlPath(ctx, opts) +) + +/** + * Handle the output + * @param {object} opts configuration + * @return {function} with ctx and body as params + */ +export const handleOutput = function(opts) { + return function(ctx, body) { + ctx.size = getDocLen(body) + ctx.type = opts.contentType; + ctx.status = SUCCESS_STATE; + ctx.body = body; + } +} + +/** + * handle HTML output for the web console + * @param {object} ctx koa context + * @param {string} body output content + * @return {void} + */ +export const handleHtmlOutput = function(ctx, body) { + ctx.size = getDocLen(body) + ctx.type = 'text/html'; + ctx.status = SUCCESS_STATE; + ctx.body = body + ''; // just make sure its string output +} + +/** + * use the ctx to generate error output + * V1.1.0 we render this as a normal output with status 200 + * then on the client side will check against the result object for error + * @param {object} ctx context + * @param {number} code 404 / 500 etc + * @param {object} e actual error + * @param {string} message if there is one + * @param {string} name custom error class name + */ +export const ctxErrorHandler = function(ctx, code, e, message = '') { + const render = handleOutput({contentType: CONTENT_TYPE}) + let name; + if (typeof code === 'string') { + name = code; + code = jsonqlErrors[name] ? jsonqlErrors[name].statusCode : -1; + } else { + name = jsonqlErrors.getErrorByStatus(code) + } + // preserve the message + if (!message && e && e.message) { + message = e.message; + } + return render(ctx, packError(e, name, code, message)) +} + +/** + * Just a wrapper to be clearer what error is it + * @param {object} ctx koa + * @param {object} e error + * @return {undefined} nothing + */ +export const forbiddenHandler = (ctx, e) => ( + ctxErrorHandler(ctx, FORBIDDEN_STATE, e, 'JsonqlAuthorisationError') +) diff --git a/packages/utils/src/middleware.js b/packages/utils/src/middleware.js new file mode 100644 index 0000000000000000000000000000000000000000..0aed9d5da3c3ca0bdb1851674a83f57c4e20a2c0 --- /dev/null +++ b/packages/utils/src/middleware.js @@ -0,0 +1,128 @@ +// this is a collection of middleware methods +// should be good to use in Koa or Express +const _ = require('lodash') +const { trim } = _; +const { + QUERY_NAME, + MUTATION_NAME, + API_REQUEST_METHODS, + PAYLOAD_PARAM_NAME, + CONDITION_PARAM_NAME, + RESOLVER_PARAM_NAME , + QUERY_ARG_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() +) + +/** + * Get document (string) byte length for use in header + * @param {string} doc to calculate + * @return {number} length + */ +const getDocLen = doc => 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 + */ +const headerParser = (req, type) => { + try { + const headers = req.headers.accept.split(',') + if (type) { + return headers.filter(h => h === type) + } + return 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} + */ +const isHeaderPresent = (req, type) => { + const headers = headerParser(req, type) + return !!headers.length; +} + +/** + * getting what is calling after the above check + * @param {string} method of call + * @return {mixed} false on failed + */ +const getCallMethod = method => { + const [ POST, PUT ] = API_REQUEST_METHODS; + switch (true) { + case method === POST: + return QUERY_NAME; + case method === PUT: + return MUTATION_NAME; + default: + return false; + } +} + +/** + * @param {string} name + * @param {string} type + * @param {object} opts + * @return {function} + */ +const getPathToFn = function(name, type, opts) { + 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.js') ) + paths.push( join(dir, type, fileName + '.js') ) + // paths.push( join(dir, fileName + '.js') ); + const ctn = paths.length; + for (let i=0; i { + return JSON.stringify({ data: result }) +} + +/** + * wrapper method - the output is trying to match up the structure of the Error sub class + * @param {mixed} detail of fn error + * @param {string} [className=JsonqlError] the errorName + * @param {number} [statusCode=500] the original error code + * @return {string} stringify error + */ +const packError = function(detail, className = 'JsonqlError', statusCode = 500, message = '') { + return JSON.stringify({ + error: { detail, className, statusCode, message } + }) +} diff --git a/packages/utils/src/params-api.js b/packages/utils/src/params-api.js new file mode 100644 index 0000000000000000000000000000000000000000..64758db4c6bfe91daa9c66ed498c575d01c586c9 --- /dev/null +++ b/packages/utils/src/params-api.js @@ -0,0 +1,142 @@ +// ported from jsonql-params-validator +// craete several helper function to construct / extract the payload +// and make sure they are all the same +import { + PAYLOAD_PARAM_NAME, + CONDITION_PARAM_NAME, + RESOLVER_PARAM_NAME, + QUERY_ARG_NAME +} from 'jsonql-constants' +import { JsonqlValidationError } from 'jsonql-errors' + +import isString from './string' +import { checkIsArray } from './array' +import { checkIsObject } from './object' + +// make sure it's an object +const formatPayload = payload => isString(payload) ? JSON.parse(payload) : payload; + +/** + * Get name from the payload (ported back from jsonql-koa) + * @param {*} payload to extract from + * @return {string} name + */ +export function getNameFromPayload(payload) { + return Object.keys(payload)[0] +} + +/** + * @param {string} resolverName name of function + * @param {array} [args=[]] from the ...args + * @param {boolean} [jsonp = false] add v1.3.0 to koa + * @return {object} formatted argument + */ +export function createQuery(resolverName, args = [], jsonp = false) { + if (isString(resolverName) && checkIsArray(args)) { + let payload = { [QUERY_ARG_NAME]: args } + if (jsonp === true) { + return payload; + } + return { [resolverName]: payload } + } + throw new JsonqlValidationError(`[createQuery] expect resolverName to be string and args to be array!`, { resolverName, args }) +} + +// string version of the above +export function createQueryStr(resolverName, args = [], jsonp = false) { + return JSON.stringify(createQuery(resolverName, args, jsonp)) +} + +/** + * @param {string} resolverName name of function + * @param {*} payload to send + * @param {object} [condition={}] for what + * @param {boolean} [jsonp = false] add v1.3.0 to koa + * @return {object} formatted argument + */ +export function createMutation(resolverName, payload, condition = {}, jsonp = false) { + const _payload = { + [PAYLOAD_PARAM_NAME]: payload, + [CONDITION_PARAM_NAME]: condition + } + if (jsonp === true) { + return _payload; + } + if (isString(resolverName)) { + return { [resolverName]: _payload } + } + throw new JsonqlValidationError(`[createMutation] expect resolverName to be string!`, { resolverName, payload, condition }) +} + +// string version of above +export function createMutationStr(resolverName, payload, condition = {}, jsonp = false) { + return JSON.stringify(createMutation(resolverName, payload, condition, jsonp)) +} + +/** + * Further break down from method below for use else where + * @param {string} resolverName name of fn + * @param {object} payload payload + * @return {object|boolean} false on failed + */ +export function getQueryFromArgs(resolverName, payload) { + if (resolverName && checkIsObject(payload)) { + const args = payload[resolverName]; + if (args[QUERY_ARG_NAME]) { + return { + [RESOLVER_PARAM_NAME]: resolverName, + [QUERY_ARG_NAME]: args[QUERY_ARG_NAME] + } + } + } + return false; +} + +/** + * extra the payload back + * @param {*} payload from http call + * @return {object} resolverName and args + */ +export function getQueryFromPayload(payload) { + const p = formatPayload(payload); + const resolverName = getNameFromPayload(p) + const result = getQueryFromArgs(resolverName, p) + if (result !== false) { + return result; + } + throw new JsonqlValidationError('[getQueryArgs] Payload is malformed!', payload) +} + +/** + * Further break down from method below for use else where + * @param {string} resolverName name of fn + * @param {object} payload payload + * @return {object|boolean} false on failed + */ +export function getMutationFromArgs(resolverName, payload) { + if (resolverName && checkIsObject(payload)) { + const args = payload[resolverName] + if (args) { + return { + [RESOLVER_PARAM_NAME]: resolverName, + [PAYLOAD_PARAM_NAME]: args[PAYLOAD_PARAM_NAME], + [CONDITION_PARAM_NAME]: args[CONDITION_PARAM_NAME] + } + } + } + return false; +} + +/** + * @param {object} payload + * @return {object} resolverName, payload, conditon + */ +export function getMutationFromPayload(payload) { + const p = formatPayload(payload); + const resolverName = getNameFromPayload(p) + const result = getMutationFromArgs(resolverName, p) + if (result !== false) { + return result; + } + throw new JsonqlValidationError('[getMutationArgs] Payload is malformed!', payload) +} diff --git a/packages/utils/tests/chain-fn.test.js b/packages/utils/tests/chain-fn.test.js new file mode 100644 index 0000000000000000000000000000000000000000..4121d2e6d4bdd0aed9910ddd496b94b47f13ddc1 --- /dev/null +++ b/packages/utils/tests/chain-fn.test.js @@ -0,0 +1,17 @@ +// need to test the chain-fns because of the way we change the lodash import +const test = require('ava') +const { chainFns } = require('../src/chain-fns') + +test('It should able to accept more than one functions after the first one', t => { + + const baseFn = (num) => num * 10; + const add1 = (num) => num + 1; + const add2 = (num) => num + 2; + + const fn = chainFns(baseFn, add1, add2) + + const result = fn(10) + + t.is(103, result) + +}) diff --git a/packages/utils/tests/fixtures/es6-fn.js b/packages/utils/tests/fixtures/es6-fn.js new file mode 100644 index 0000000000000000000000000000000000000000..309491c41f9f424816f27cc8ccdd57e38576222f --- /dev/null +++ b/packages/utils/tests/fixtures/es6-fn.js @@ -0,0 +1,4 @@ + +export default function fun() { + return `I am fine!` +} diff --git a/packages/utils/tests/fixtures/import.js b/packages/utils/tests/fixtures/import.js new file mode 100644 index 0000000000000000000000000000000000000000..b25adadc683b3e61d5f151676d5d20ce3f25364c --- /dev/null +++ b/packages/utils/tests/fixtures/import.js @@ -0,0 +1,9 @@ +// testing the new ES6 dynamic import feature +const { join } = require('path') +// it doens't work natively yet so screw it @2019-09-02 +import(join(__dirname, 'es6-fn.js')) + .then(fn => { + console.info(typeof fn) + console.info(fn.toString()) + console.info(fn) + }) diff --git a/packages/validator/index.js b/packages/validator/index.js index ebaac53115f62cdec7d1982a9af0d37cbb687d43..afc610a6f81ea252009348b7d95eebbc3d84fc67 100644 --- a/packages/validator/index.js +++ b/packages/validator/index.js @@ -47,10 +47,9 @@ import checkIsContract from './src/check-is-contract' export const isContract = checkIsContract; -// add in v1.3.0 - +// from v1.3.0 import * as paramsApi from './src/params-api' - +// params-api export const createQuery = paramsApi.createQuery; export const createQueryStr = paramsApi.createQueryStr; export const createMutation = paramsApi.createMutation; diff --git a/packages/validator/package.json b/packages/validator/package.json index 6d58239d6cf3d73c785dc15332936b3a861732b9..334e72dfc7358efdd52d0ab2d9ae2581a9c37a59 100644 --- a/packages/validator/package.json +++ b/packages/validator/package.json @@ -24,7 +24,6 @@ "test:check:sync": "DEBUG=jsonql-params-validator:* ava ./tests/check-options-sync.test.js", "test:check:client": "DEBUG=jsonql-params-validator:* ava ./tests/check-node-client-async.test.js", "test:config": "DEBUG=jsonql-params-validator:* ava ./tests/construct-config.test.js", - "test:params": "DEBUG=jsonql-params-validator* ava ./tests/params-api.test.js", "test:bug": "DEBUG=jsonql-params-validator* ava ./tests/ws-check-options.test.js", "debug": "inspect node_modules/ava/profile.js ./tests/combine.test.js", "try": "DEBUG=jsonql-params-validator:* node ./tests/fixtures/try.js", diff --git a/packages/validator/src/params-api.js b/packages/validator/src/params-api.js index a5f7bfea1e20113e7052e11a4294d692404875cd..64758db4c6bfe91daa9c66ed498c575d01c586c9 100644 --- a/packages/validator/src/params-api.js +++ b/packages/validator/src/params-api.js @@ -1,3 +1,4 @@ +// ported from jsonql-params-validator // craete several helper function to construct / extract the payload // and make sure they are all the same import { diff --git a/packages/validator/tests/params-api.test.js b/packages/validator/tests/params-api.test.js index 0039902455ae59d49cd8d26cc397656b3f5af493..110dde0f13469f6d8ab643ef7340cf9bcdabb859 100644 --- a/packages/validator/tests/params-api.test.js +++ b/packages/validator/tests/params-api.test.js @@ -9,7 +9,7 @@ const { getNameFromPayload } = require('../dist/jsonql-params-validator.cjs') const { PAYLOAD_PARAM_NAME, CONDITION_PARAM_NAME, RESOLVER_PARAM_NAME } = require('jsonql-constants') -const debug = require('debug')('jsonql-params-validator:test:params-api') +const debug = require('debug')('jsonql:params-api') import { JsonqlValidationError } from 'jsonql-errors' diff --git a/packages/vue/package.json b/packages/vue/package.json deleted file mode 100644 index 2e906044420c99c227475559b8daa4ac6fc21d22..0000000000000000000000000000000000000000 --- a/packages/vue/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "vue", - "version": "0.1.0", - "private": true, - "devDependencies": { - "@vue/cli-plugin-babel": "^3.11.0", - "@vue/cli-plugin-eslint": "^3.11.0", - "@vue/cli-service": "^3.11.0" - } -} \ No newline at end of file diff --git a/packages/web-console/src/plugin/public-contract.json b/packages/web-console/src/plugin/public-contract.json index c7808b85dd107461dbde05cacbebb7de39147319..a31c6b80a11bdfe1923576081bed546d7e2a0c57 100644 --- a/packages/web-console/src/plugin/public-contract.json +++ b/packages/web-console/src/plugin/public-contract.json @@ -10,14 +10,14 @@ } ] }, - "defaultCall": { - "description": false, + "getUser": { + "description": "Get a user info", "params": [ { "type": [ "number" ], - "description": "a phony id", + "description": "the user id", "name": "id" } ], @@ -26,37 +26,77 @@ "type": [ "object" ], - "description": "an object with whatever" + "description": "userdata" } ] } }, "mutation": { - "defaultSave": { - "description": false, + "saveUser": { + "description": "Save userdata using id to identify which one", "params": [ { "type": [ "object" ], - "name": "payload" + "description": "the userdata object --> create interface", + "name": "payload", + "keys": [ + { + "type": [ + "string" + ], + "description": "name of user", + "name": "username", + "parent": "payload" + }, + { + "type": [ + "string" + ], + "description": "full name", + "name": "fullname", + "parent": "payload" + }, + { + "type": [ + "number", + "any" + ], + "description": "optional time stamp when created", + "name": "created", + "parent": "payload" + } + ] }, { "type": [ "object" ], - "name": "condition" + "description": "where cause", + "name": "condition", + "keys": [ + { + "type": [ + "number" + ], + "description": "the user id", + "name": "id", + "parent": "condition" + } + ] } ], "returns": [ { "type": [ "boolean" - ] + ], + "description": "true when OK" } ] } }, "auth": {}, - "timestamp": 1563798679 + "timestamp": 1565667859 }