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 @@
-
-
-
{{ msg }}
-
- For a guide and recipes on how to configure / customize this project,
- check out the
- vue-cli documentation.
-
-
Installed CLI Plugins
-
-
Essential Links
-
-
Ecosystem
-
-
-
-
-
-
-
-
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
}