miolo 2.0.0-beta.1 → 2.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/miolo.cli.umd.js +1 -1
- package/dist/cli-react/miolo.cli-react.umd.js +1 -1
- package/dist/server/miolo.server.node.mjs +1 -1
- package/package.json +18 -16
- package/src/cli/catcher/index.mjs +75 -0
- package/src/cli/fetcher/fetcher.mjs +214 -0
- package/src/cli/fetcher/index.mjs +7 -0
- package/src/cli/fetcher/utils.mjs +51 -0
- package/src/cli/fetcher/v1.tar.gz +0 -0
- package/src/cli/index.mjs +30 -0
- package/src/cli/socket/index.mjs +6 -0
- package/src/cli-react/AppBrowser.jsx +14 -0
- package/src/cli-react/AppBrowser.mjs +14 -0
- package/src/cli-react/AppServer.jsx +17 -0
- package/src/cli-react/AppServer.mjs +16 -0
- package/src/cli-react/_jsx.tar.gz +0 -0
- package/src/cli-react/context/MioloContext.mjs +5 -0
- package/src/cli-react/context/MioloContextProvider.jsx +87 -0
- package/src/cli-react/context/MioloContextProvider.mjs +80 -0
- package/src/cli-react/context/useMioloContext.jsx +6 -0
- package/src/cli-react/context/useMioloContext.mjs +6 -0
- package/src/cli-react/context/withMioloContext.jsx +15 -0
- package/src/cli-react/context/withMioloContext.mjs +17 -0
- package/src/cli-react/index.mjs +7 -0
- package/src/cli-react/ssr/getSsrDataFromContext.mjs +33 -0
- package/src/cli-react/ssr/hooks.tar.gz +0 -0
- package/src/cli-react/ssr/useSsrDataOrReload.mjs +43 -0
- package/src/server/config/defaults.mjs +418 -0
- package/src/server/config/index.mjs +32 -0
- package/src/server/engines/cron/emails.mjs +10 -0
- package/src/server/engines/cron/index.mjs +153 -0
- package/src/server/engines/cron/init.mjs +53 -0
- package/src/server/engines/cron/ipsum.mjs +151 -0
- package/src/server/engines/cron/syscheck.mjs +56 -0
- package/src/server/engines/emailer/index.mjs +2 -0
- package/src/server/engines/emailer/queue.mjs +54 -0
- package/src/server/engines/emailer/transporter.mjs +149 -0
- package/src/server/engines/geoip/index.mjs +66 -0
- package/src/server/engines/http/index.mjs +79 -0
- package/src/server/engines/logger/index.mjs +313 -0
- package/src/server/engines/logger/logger_mail.mjs +89 -0
- package/src/server/engines/logger/reopenTransportOnHupSignal.mjs +57 -0
- package/src/server/engines/logger/verify.mjs +22 -0
- package/src/server/engines/parser/Parser.mjs +126 -0
- package/src/server/engines/parser/index.mjs +6 -0
- package/src/server/engines/socket/index.mjs +67 -0
- package/src/server/index.mjs +16 -0
- package/src/server/middleware/auth/basic.mjs +90 -0
- package/src/server/middleware/auth/credentials/index.mjs +151 -0
- package/src/server/middleware/auth/credentials/session/index.mjs +24 -0
- package/src/server/middleware/auth/credentials/session/store.mjs +59 -0
- package/src/server/middleware/auth/credentials/session/store_koa_redis.mjs +3 -0
- package/src/server/middleware/auth/custom.mjs +29 -0
- package/src/server/middleware/auth/guest.mjs +75 -0
- package/src/server/middleware/context/cache/index.mjs +61 -0
- package/src/server/middleware/context/cache/options.mjs +66 -0
- package/src/server/middleware/context/db.mjs +58 -0
- package/src/server/middleware/context/index.mjs +35 -0
- package/src/server/middleware/extra.mjs +12 -0
- package/src/server/middleware/http/body.mjs +31 -0
- package/src/server/middleware/http/catcher.mjs +81 -0
- package/src/server/middleware/http/custom_blacklist.mjs +16 -0
- package/src/server/middleware/http/headers.mjs +73 -0
- package/src/server/middleware/http/ratelimit.mjs +66 -0
- package/src/server/middleware/http/request.mjs +146 -0
- package/src/server/middleware/routes/catch_js_error.mjs +41 -0
- package/src/server/middleware/routes/robots.mjs +21 -0
- package/src/server/middleware/routes/router/crud/attachCrudRoutes.mjs +214 -0
- package/src/server/middleware/routes/router/crud/getCrudConfig.mjs +129 -0
- package/src/server/middleware/routes/router/defaults.mjs +29 -0
- package/src/server/middleware/routes/router/index.mjs +49 -0
- package/src/server/middleware/routes/router/queries/attachQueriesRoutes.mjs +102 -0
- package/src/server/middleware/routes/router/queries/getQueriesConfig.mjs +113 -0
- package/src/server/middleware/routes/router/utils.mjs +38 -0
- package/src/server/middleware/ssr/_old.tar.gz +0 -0
- package/src/server/middleware/ssr/context.mjs +21 -0
- package/src/server/middleware/ssr/fallbackIndex.mjs +29 -0
- package/src/server/middleware/ssr/html.mjs +64 -0
- package/src/server/middleware/ssr/loader.mjs +24 -0
- package/src/server/middleware/ssr/ssr_render.mjs +49 -0
- package/src/server/middleware/static/afialapis.ico +0 -0
- package/src/server/middleware/static/index.mjs +27 -0
- package/src/server/middleware/static/miolo.ico +0 -0
- package/src/server/middleware/vite/devserver.mjs +34 -0
- package/src/server/server-dev.mjs +41 -0
- package/src/server/server.mjs +135 -0
- package/src/server/static/img/afialapis.ico +0 -0
- package/src/server/static/img/miolo.ico +0 -0
- package/src/server/static/robots.txt +2 -0
- package/dist/cli/miolo.cli.iife.bundle.js +0 -968
- package/dist/cli/miolo.cli.iife.bundle.js.map +0 -1
- package/dist/cli/miolo.cli.iife.bundle.min.js +0 -13
- package/dist/cli/miolo.cli.iife.js +0 -968
- package/dist/cli/miolo.cli.iife.js.map +0 -1
- package/dist/cli/miolo.cli.iife.min.js +0 -13
- package/dist/cli/miolo.cli.min.mjs +0 -13
- package/dist/cli/miolo.cli.mjs +0 -485
- package/dist/cli/miolo.cli.mjs.map +0 -1
- package/dist/cli/miolo.cli.umd.bundle.js +0 -969
- package/dist/cli/miolo.cli.umd.bundle.js.map +0 -1
- package/dist/cli/miolo.cli.umd.bundle.min.js +0 -13
- package/dist/cli/miolo.cli.umd.min.js +0 -13
- package/dist/cli-react/miolo.cli-react.iife.bundle.js +0 -1232
- package/dist/cli-react/miolo.cli-react.iife.bundle.js.map +0 -1
- package/dist/cli-react/miolo.cli-react.iife.bundle.min.js +0 -13
- package/dist/cli-react/miolo.cli-react.iife.js +0 -1174
- package/dist/cli-react/miolo.cli-react.iife.js.map +0 -1
- package/dist/cli-react/miolo.cli-react.iife.min.js +0 -13
- package/dist/cli-react/miolo.cli-react.min.mjs +0 -13
- package/dist/cli-react/miolo.cli-react.mjs +0 -655
- package/dist/cli-react/miolo.cli-react.mjs.map +0 -1
- package/dist/cli-react/miolo.cli-react.umd.bundle.js +0 -1233
- package/dist/cli-react/miolo.cli-react.umd.bundle.js.map +0 -1
- package/dist/cli-react/miolo.cli-react.umd.bundle.min.js +0 -13
- package/dist/cli-react/miolo.cli-react.umd.min.js +0 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "miolo",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.2",
|
|
4
4
|
"description": "all-in-one koa-based server",
|
|
5
5
|
"author": "Donato Lorenzo <donato@afialapis.com>",
|
|
6
6
|
"contributors": [
|
|
@@ -15,15 +15,9 @@
|
|
|
15
15
|
},
|
|
16
16
|
"homepage": "https://www.afialapis.com/os/miolo",
|
|
17
17
|
"license": "MIT",
|
|
18
|
-
"XX_exports": {
|
|
19
|
-
"./server": {
|
|
20
|
-
"import": "./dist/server/miolo.server.node.mjs",
|
|
21
|
-
"default": "./dist/server/miolo.server.cjs"
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
18
|
"exports": {
|
|
25
19
|
"./server": {
|
|
26
|
-
"default": "./
|
|
20
|
+
"default": "./dist/server/miolo.server.node.mjs"
|
|
27
21
|
},
|
|
28
22
|
"./server-dev": {
|
|
29
23
|
"default": "./src/server/server-dev.mjs"
|
|
@@ -38,31 +32,39 @@
|
|
|
38
32
|
}
|
|
39
33
|
},
|
|
40
34
|
"files": [
|
|
35
|
+
"src",
|
|
41
36
|
"logo",
|
|
42
37
|
"dist"
|
|
43
38
|
],
|
|
44
39
|
"scripts": {
|
|
45
|
-
"
|
|
40
|
+
"reset": "rm -fr node_modules package-lock.json npm-lock.yaml && npm i",
|
|
46
41
|
"cli-clean": "rm -fr ./dist/cli/* ",
|
|
47
|
-
"cli-bundle": "npx xeira bundle --target=browser --source_index=./src/cli/index.mjs --bundle_folder=./dist/cli --bundle_name=miolo.cli --bundle_node_polyfill=true",
|
|
42
|
+
"cli-bundle": "npx xeira bundle --target=browser --source_index=./src/cli/index.mjs --bundle_folder=./dist/cli --bundle_name=miolo.cli --bundle_node_polyfill=true --bundle_extension=umd",
|
|
48
43
|
"cli-dist": "npm run cli-clean && npm run cli-bundle",
|
|
49
44
|
"cli-react-clean": "rm -fr ./dist/cli-react/*",
|
|
50
|
-
"cli-react-bundle": "npx xeira bundle --target=browser --source_index=./src/cli-react/index.mjs --bundle_folder=./dist/cli-react --bundle_name=miolo.cli-react --bundle_node_polyfill=true",
|
|
45
|
+
"cli-react-bundle": "npx xeira bundle --target=browser --source_index=./src/cli-react/index.mjs --bundle_folder=./dist/cli-react --bundle_name=miolo.cli-react --bundle_node_polyfill=true --bundle_extension=umd",
|
|
51
46
|
"cli-react-dist": "npm run cli-react-clean && npm run cli-react-bundle",
|
|
52
47
|
"server-clean": "rm -fr ./dist/server/*",
|
|
53
48
|
"server-bundle": "npx xeira bundle --target=node --source_index=./src/server/index.mjs --bundle_folder=./dist/server --bundle_name=miolo.server --bundle_extension=node.mjs",
|
|
54
49
|
"server-dist": "npm run server-clean && npm run server-bundle",
|
|
50
|
+
|
|
51
|
+
"YY-server-dev-clean": "rm -fr ./dist/server-dev/*",
|
|
52
|
+
"YY-server-dev-bundle": "npx xeira bundle --target=node --source_index=./src/server/server-dev.mjs --bundle_folder=./dist/server-dev --bundle_name=miolo.server.dev --bundle_extension=node.mjs",
|
|
53
|
+
"YY-server-dev-dist": "npm run server-dev-clean && npm run server-dev-bundle",
|
|
54
|
+
|
|
55
55
|
"dist": "npm run cli-dist && npm run cli-react-dist && npm run server-dist",
|
|
56
|
+
"site": "npx xeira site",
|
|
57
|
+
"test": "npx xeira test --files=./test/index.mjs",
|
|
58
|
+
|
|
59
|
+
"X_pre-publish": "npm run test && npm run dist && npm run site",
|
|
60
|
+
"pre-publish": "npm run dist && npm run site",
|
|
61
|
+
|
|
62
|
+
|
|
56
63
|
"xxx_demo-guest": "rm -fr ./demo/build/miolo-demo-guest* && node demo/run.cjs --guest",
|
|
57
64
|
"xxx_demo-basic": "rm -fr ./demo/build/miolo-demo-basic* && node demo/run.cjs --basic",
|
|
58
65
|
"xxx_demo-credentials": "rm -fr ./demo/build/miolo-demo-credentials* && node demo/run.cjs --credentials",
|
|
59
66
|
"xxx_demo-credentials-debug": "rm -fr ./demo/build/miolo-demo-credentials* && DEBUG=winston* node demo/run.cjs --credentials",
|
|
60
67
|
"xxx_demo": "npm run demo-credentials",
|
|
61
|
-
"site": "npx xeira site",
|
|
62
|
-
"test": "npx xeira test --files=./test/index.mjs",
|
|
63
|
-
"reset": "npm run main:purge && npm i",
|
|
64
|
-
"X_prepare": "npm run test && npm run dist && npm run site",
|
|
65
|
-
"prepare": "npm run dist && npm run site",
|
|
66
68
|
|
|
67
69
|
"xxx_server-dist-esbuild": "npx esbuild ./src/server/index.mjs --bundle --platform=node --outfile=dist/server/server.mjs --format=esm --external:@babel/preset-typescript --external:lightningcss --external:tty",
|
|
68
70
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
function init_catcher (catcher_url, fetcher) {
|
|
2
|
+
if (typeof window == "undefined") {
|
|
3
|
+
return
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
if (window.miolo_listeners===true) {
|
|
7
|
+
return
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// window.onerror = function(msg, file, line, col, error) {
|
|
11
|
+
// try {
|
|
12
|
+
// const params= {
|
|
13
|
+
// 'error': {
|
|
14
|
+
// msg, file, line, col, error
|
|
15
|
+
// },
|
|
16
|
+
// 'path' : window.location.pathname,
|
|
17
|
+
// 'agent': 'UserAgent' + navigator.userAgent
|
|
18
|
+
// }
|
|
19
|
+
//
|
|
20
|
+
// fetcher.post(catcher_url, params)
|
|
21
|
+
// } catch(e) {
|
|
22
|
+
// console.error(e)
|
|
23
|
+
// }
|
|
24
|
+
// }
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
window.addEventListener("error", (event) => {
|
|
28
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const params= {
|
|
32
|
+
'error': {
|
|
33
|
+
msg: event?.message || 'Client error',
|
|
34
|
+
file: event?.filename,
|
|
35
|
+
line: event?.lineno,
|
|
36
|
+
col: event?.colno,
|
|
37
|
+
error: event?.error
|
|
38
|
+
},
|
|
39
|
+
'path' : window.location.pathname,
|
|
40
|
+
'agent': 'UserAgent' + navigator.userAgent
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fetcher.post(catcher_url, params)
|
|
44
|
+
} catch(e) {
|
|
45
|
+
console.error(e)
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
50
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const params= {
|
|
54
|
+
'warning': {
|
|
55
|
+
msg: event?.reason || 'Client Unhandled rejection',
|
|
56
|
+
file: undefined,
|
|
57
|
+
line: undefined,
|
|
58
|
+
col: undefined,
|
|
59
|
+
error: event?.reason
|
|
60
|
+
},
|
|
61
|
+
'path' : window.location.pathname,
|
|
62
|
+
'agent': 'UserAgent' + navigator.userAgent
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
fetcher.post(catcher_url, params)
|
|
66
|
+
} catch(e) {
|
|
67
|
+
console.error(e)
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
window.miolo_listeners = true
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export {init_catcher}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import {omit_nil, trim_left, json_to_query_string, parse_login_cookie} from './utils.mjs'
|
|
2
|
+
|
|
3
|
+
class Fetcher {
|
|
4
|
+
/**
|
|
5
|
+
* @param {*} config {hostname, port, force_hostname, silent_fail: false}
|
|
6
|
+
*/
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config= config
|
|
9
|
+
this.auth = undefined
|
|
10
|
+
this.cookie = undefined
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
set_auth(auth) {
|
|
14
|
+
if (auth) {
|
|
15
|
+
const {username, password}= auth
|
|
16
|
+
this.auth= {username, password}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
get_headers() {
|
|
21
|
+
let headers = {}
|
|
22
|
+
|
|
23
|
+
if (this.auth) {
|
|
24
|
+
let {username, password}= this.auth
|
|
25
|
+
username= username || ''
|
|
26
|
+
password= password || ''
|
|
27
|
+
|
|
28
|
+
let sauth
|
|
29
|
+
try {
|
|
30
|
+
sauth= 'Basic ' + Buffer.from(username + ":" + password).toString('base64')
|
|
31
|
+
} catch(_) {
|
|
32
|
+
sauth= 'Basic ' + btoa(username + ":" + password)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
headers['Authorization']= sauth
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (this.cookie) {
|
|
39
|
+
headers['Cookie']= this.cookie
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return headers
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
_prepare_url (url) {
|
|
46
|
+
const endpoint = '/' + trim_left(url, '/')
|
|
47
|
+
|
|
48
|
+
const {hostname, port, force_hostname} = this.config || {}
|
|
49
|
+
if (hostname && force_hostname) {
|
|
50
|
+
return `http://${hostname}:${port}${endpoint}`
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return endpoint
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async _fetch (method, url, params, auth= undefined) {
|
|
57
|
+
this.set_auth(auth)
|
|
58
|
+
|
|
59
|
+
let request = {
|
|
60
|
+
method,
|
|
61
|
+
mode: 'cors',
|
|
62
|
+
credentials: 'include',
|
|
63
|
+
headers: {
|
|
64
|
+
'content-type': 'application/json',
|
|
65
|
+
...this.get_headers() || {}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let wurl = this._prepare_url(url)
|
|
70
|
+
|
|
71
|
+
if (method === 'POST') {
|
|
72
|
+
request.body = JSON.stringify(params || {}, (k, v) => v === undefined ? null : v)
|
|
73
|
+
} else if (method === 'GET') {
|
|
74
|
+
if (params) {
|
|
75
|
+
wurl+= json_to_query_string(params)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const response = await fetch(wurl, request)
|
|
80
|
+
|
|
81
|
+
if (response.redirected) {
|
|
82
|
+
const isBrowser = typeof window == 'object'
|
|
83
|
+
if (isBrowser) {
|
|
84
|
+
// JSDOM does not support navigation, so lets skip it for tests
|
|
85
|
+
const isTest = typeof navigator !== "undefined" &&
|
|
86
|
+
navigator.userAgent.includes("Node.js");
|
|
87
|
+
if (!isTest) {
|
|
88
|
+
window.location.replace(response.url)
|
|
89
|
+
return Promise.resolve(response)
|
|
90
|
+
} else {
|
|
91
|
+
console.error(`Response for ${wurl} is a redirect to ${response.url}. But you are in a test environment, where redirects cannot be done. Unexpected results are coming...`)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (response.headers.get('content-type').indexOf('json') >= 0) {
|
|
97
|
+
const data= await response.json()
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
data,
|
|
101
|
+
status: response.status,
|
|
102
|
+
response
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const data= await response.text()
|
|
107
|
+
return {
|
|
108
|
+
data,
|
|
109
|
+
status: response.status,
|
|
110
|
+
response
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async get(url, params, auth= undefined) {
|
|
116
|
+
/* eslint no-unused-vars:0 */
|
|
117
|
+
try {
|
|
118
|
+
const resp = await this._fetch('GET', url, omit_nil(params), auth)
|
|
119
|
+
return resp
|
|
120
|
+
} catch(e) {
|
|
121
|
+
if (this.config?.silent_fail !== true) {
|
|
122
|
+
console.error(`Error on GET ${url}`)
|
|
123
|
+
console.error(e)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
data: e,
|
|
128
|
+
status: -1,
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async post(url, data, auth= undefined) {
|
|
134
|
+
try {
|
|
135
|
+
const resp = await this._fetch('POST', url, data, auth)
|
|
136
|
+
return resp
|
|
137
|
+
} catch(e) {
|
|
138
|
+
if (this.config?.silent_fail !== true) {
|
|
139
|
+
console.error(`Error on POST ${url}`)
|
|
140
|
+
console.error(e)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
data: e,
|
|
145
|
+
status: -1
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async login(url, {username, password}) {
|
|
151
|
+
const res= await this._fetch('POST', url || '/login', {username, password})
|
|
152
|
+
this.cookie= parse_login_cookie(res.response)
|
|
153
|
+
return res
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async logout(url) {
|
|
157
|
+
this.cookie= undefined
|
|
158
|
+
const res= await this._fetch('POST', url || '/logout', {})
|
|
159
|
+
return res
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async read(url, params, auth= undefined) {
|
|
163
|
+
const result = await this.get(`${url}/read`, params, auth)
|
|
164
|
+
return result.data
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async key_list(url, params, auth= undefined) {
|
|
168
|
+
const result = await this.get(`${url}/key_list`, params, auth)
|
|
169
|
+
return result.data
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async name_list(url, params, auth= undefined) {
|
|
173
|
+
const result = await this.key_list(url, params, auth)
|
|
174
|
+
return Object.values(result)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
async find(url, id, auth= undefined) {
|
|
178
|
+
const result = await this.get(`${url}/find`, { id: id }, auth)
|
|
179
|
+
return result.data
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async distinct(url, field, params, auth= undefined) {
|
|
183
|
+
const nparams= {
|
|
184
|
+
...params,
|
|
185
|
+
distinct_field: field
|
|
186
|
+
}
|
|
187
|
+
const result = await this.get(`${url}/distinct`, nparams, auth)
|
|
188
|
+
return result.data
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async upsave(url, data, auth= undefined) {
|
|
192
|
+
let result
|
|
193
|
+
if (data.id == undefined) {
|
|
194
|
+
delete data.id
|
|
195
|
+
result= await this.post(`${url}/save`, data, auth)
|
|
196
|
+
} else {
|
|
197
|
+
result= await this.post(`${url}/update`, data, auth)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return result.data
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async remove(url, id, auth= undefined) {
|
|
204
|
+
const data = { id: id }
|
|
205
|
+
const result = await this.post(`${url}/delete`, data, auth)
|
|
206
|
+
return result.data
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
Fetcher.keyList= Fetcher.key_list
|
|
211
|
+
Fetcher.nameList= Fetcher.name_list
|
|
212
|
+
|
|
213
|
+
export { Fetcher }
|
|
214
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform an JSON object to a query string
|
|
3
|
+
*/
|
|
4
|
+
export function json_to_query_string(obj) {
|
|
5
|
+
if (obj && (Object.keys(obj).length>0)) {
|
|
6
|
+
const uparams = new URLSearchParams()
|
|
7
|
+
for (const key in obj) {
|
|
8
|
+
if (Object.hasOwn(obj, key)) {
|
|
9
|
+
const value = obj[key];
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
value.forEach(item => uparams.append(key, item))
|
|
12
|
+
} else if (value !== undefined && value !== null) {
|
|
13
|
+
uparams.append(key, value)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return uparams.toString()
|
|
18
|
+
}
|
|
19
|
+
return ''
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function trim_left(str, what) {
|
|
23
|
+
return str.replace(new RegExp(`^${what || '\\s'}+`), '')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
export function omit_nil(obj) {
|
|
28
|
+
if (typeof obj !== 'object') return obj
|
|
29
|
+
return Object.keys(obj).reduce((acc, v) => {
|
|
30
|
+
if (obj[v] !== undefined) acc[v] = obj[v]
|
|
31
|
+
return acc
|
|
32
|
+
}, {})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
export function parse_login_cookie(response) {
|
|
37
|
+
if (typeof window !== 'object') {
|
|
38
|
+
return undefined
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const raw = response.headers.raw()['set-cookie'];
|
|
42
|
+
return raw.map((entry) => {
|
|
43
|
+
const parts = entry.split(';');
|
|
44
|
+
const cookiePart = parts[0];
|
|
45
|
+
return cookiePart;
|
|
46
|
+
}).join(';');
|
|
47
|
+
} catch(e) {
|
|
48
|
+
console.log('[miolo-cli] Could not get the set-cookie after login')
|
|
49
|
+
return undefined
|
|
50
|
+
}
|
|
51
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {init_catcher} from './catcher/index.mjs'
|
|
2
|
+
import {init_fetcher} from './fetcher/index.mjs'
|
|
3
|
+
// import {init_socket} from './socket/index.mjs'
|
|
4
|
+
|
|
5
|
+
function miolo_client(context) {
|
|
6
|
+
|
|
7
|
+
const {config} = context
|
|
8
|
+
|
|
9
|
+
const fetcher = init_fetcher(config)
|
|
10
|
+
|
|
11
|
+
if (config?.catcher_url) {
|
|
12
|
+
init_catcher(config?.catcher_url, fetcher)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// let socket
|
|
16
|
+
// if (config?.socket?.enabled===true) {
|
|
17
|
+
// const domain = config?.socket?.domain
|
|
18
|
+
// const options = config?.socket?.options
|
|
19
|
+
// socket = init_socket(domain, options)
|
|
20
|
+
// }
|
|
21
|
+
|
|
22
|
+
const miolo_obj= {
|
|
23
|
+
fetcher,
|
|
24
|
+
//socket
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return miolo_obj
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {miolo_client}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import MioloContextProvider from './context/MioloContextProvider.jsx'
|
|
3
|
+
|
|
4
|
+
const AppBrowser = ({ children }) => {
|
|
5
|
+
const context = typeof window !== 'undefined' && window.__CONTEXT ? window.__CONTEXT : {};
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<MioloContextProvider context={context}>
|
|
9
|
+
{children}
|
|
10
|
+
</MioloContextProvider>
|
|
11
|
+
)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default AppBrowser
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import MioloContextProvider from './context/MioloContextProvider.mjs'
|
|
3
|
+
|
|
4
|
+
const AppBrowser = ({ children }) => {
|
|
5
|
+
const context = typeof window !== 'undefined' && window.__CONTEXT ? window.__CONTEXT : {};
|
|
6
|
+
|
|
7
|
+
return React.createElement(
|
|
8
|
+
MioloContextProvider,
|
|
9
|
+
{ context },
|
|
10
|
+
children
|
|
11
|
+
)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default AppBrowser
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import MioloContextProvider from './context/MioloContextProvider.jsx'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
const AppServer = ({context, children}) => {
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<MioloContextProvider
|
|
10
|
+
context= {context || {}}>
|
|
11
|
+
{children}
|
|
12
|
+
</MioloContextProvider>
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default AppServer
|
|
17
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import MioloContextProvider from './context/MioloContextProvider.mjs'
|
|
3
|
+
|
|
4
|
+
const AppServer = ({ context, children }) => {
|
|
5
|
+
|
|
6
|
+
console.log('AppServerAppServerAppServerAppServerAppServerAppServer')
|
|
7
|
+
console.log(context)
|
|
8
|
+
|
|
9
|
+
return React.createElement(
|
|
10
|
+
MioloContextProvider,
|
|
11
|
+
{ context: context || {} },
|
|
12
|
+
children
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default AppServer
|
|
Binary file
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React , {useState, useEffect, useCallback} from 'react'
|
|
2
|
+
import Context from './MioloContext.mjs'
|
|
3
|
+
import { miolo_client } from '../../cli/index.mjs'
|
|
4
|
+
import { useSsrDataOrReload } from '../ssr/useSsrDataOrReload.mjs'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const MioloContextProvider = ({context, children}) => {
|
|
8
|
+
const [innerContext, setInnerContext]= useState(context)
|
|
9
|
+
const [mioloObj, setMioloObj]= useState(miolo_client(context))
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
setInnerContext(context)
|
|
13
|
+
setMioloObj(miolo_client(context))
|
|
14
|
+
}, [context])
|
|
15
|
+
|
|
16
|
+
const login = useCallback(async (credentials) => {
|
|
17
|
+
const {fetcher} = mioloObj
|
|
18
|
+
const {config} = innerContext
|
|
19
|
+
|
|
20
|
+
const url = config.login_url || '/login'
|
|
21
|
+
const resp = await fetcher.login(url, credentials)
|
|
22
|
+
|
|
23
|
+
if (resp?.data) {
|
|
24
|
+
const nContext = {
|
|
25
|
+
...innerContext,
|
|
26
|
+
...resp?.data
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (resp?.data?.authenticated) {
|
|
30
|
+
setInnerContext(nContext)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return resp?.data
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {}
|
|
37
|
+
}, [innerContext, mioloObj])
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
const logout = useCallback(async () => {
|
|
41
|
+
const {fetcher} = mioloObj
|
|
42
|
+
const {config} = innerContext
|
|
43
|
+
|
|
44
|
+
const url = config.logout_url || '/logout'
|
|
45
|
+
const _resp = await fetcher.logout(url)
|
|
46
|
+
// resp.redirected= true
|
|
47
|
+
|
|
48
|
+
const nContext = {
|
|
49
|
+
...innerContext,
|
|
50
|
+
user: undefined,
|
|
51
|
+
authenticated: false
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
setInnerContext(nContext)
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
user: undefined,
|
|
58
|
+
authenticated: false
|
|
59
|
+
}
|
|
60
|
+
}, [innerContext, mioloObj])
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
const useSsrData = (name, defval, loader, modifier) => {
|
|
64
|
+
return useSsrDataOrReload(innerContext, mioloObj, name, defval, loader, modifier)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<Context.Provider
|
|
69
|
+
value={{
|
|
70
|
+
//context: innerContext,
|
|
71
|
+
//setContext: setInnerContext,
|
|
72
|
+
//miolo: mioloObj,
|
|
73
|
+
user: innerContext.user,
|
|
74
|
+
authenticated: innerContext.authenticated,
|
|
75
|
+
fetcher: mioloObj.fetcher,
|
|
76
|
+
//socket: mioloObj.socket,
|
|
77
|
+
login,
|
|
78
|
+
logout,
|
|
79
|
+
useSsrData
|
|
80
|
+
}}>
|
|
81
|
+
{children}
|
|
82
|
+
</Context.Provider>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
export default MioloContextProvider
|