@coderich/sandman 0.0.4 → 0.0.5

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/index.js CHANGED
@@ -1 +1,5 @@
1
- module.exports = require('./src/app');
1
+ const Sandman = require('./src/Sandman');
2
+
3
+ module.exports = (configDir) => {
4
+ return new Sandman(configDir);
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coderich/sandman",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "main": "index.js",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -18,6 +18,7 @@
18
18
  "@coderich/config": "2.2.4",
19
19
  "@coderich/util": "2.1.3",
20
20
  "chokidar": "4.0.3",
21
+ "lodash.clonedeep": "4.5.0",
21
22
  "lodash.merge": "4.6.2"
22
23
  },
23
24
  "devDependencies": {
@@ -1,25 +1,30 @@
1
- const FS = require('fs');
2
- const Path = require('path');
1
+ // const FS = require('fs');
2
+ // const Path = require('path');
3
+ const cloneDeep = require('lodash.clonedeep');
3
4
  const Config = require('@coderich/config');
4
5
 
5
6
  module.exports = class ConfigClient extends Config {
6
- mergeConfigDir(dir) {
7
- const ignored = (parsed) => {
8
- if (parsed.name.startsWith('.')) return true;
9
- const stat = FS.statSync(Path.join(parsed.dir, `${parsed.name}${parsed.ext}`));
10
- if (stat?.isDirectory()) return false;
11
- return !['.yml', '.yaml'].includes(parsed.ext.toLowerCase());
12
- };
7
+ get(...args) {
8
+ return cloneDeep(super.get(...args));
9
+ }
13
10
 
14
- const arr = Config.dirPaths(dir, ignored);
11
+ // mergeConfigDir(dir) {
12
+ // const ignored = (parsed) => {
13
+ // if (parsed.name.startsWith('.')) return true;
14
+ // const stat = FS.statSync(Path.join(parsed.dir, `${parsed.name}${parsed.ext}`));
15
+ // if (stat?.isDirectory()) return false;
16
+ // return !['.yml', '.yaml'].includes(parsed.ext.toLowerCase());
17
+ // };
15
18
 
16
- const yaml = arr.reduce((prev, { paths, data }) => {
17
- const path = paths.join('.');
18
- if (!path.length) return prev.concat(data);
19
- const indented = data.split('\n').map(line => (line.trim() ? ` ${line}` : line)).join('\n');
20
- return prev.concat(`${path}:\n${indented}`);
21
- }, '');
19
+ // const arr = Config.dirPaths(dir, ignored);
22
20
 
23
- return this.merge(Config.parseYaml(yaml));
24
- }
21
+ // const yaml = arr.reduce((prev, { paths, data }) => {
22
+ // const path = paths.join('.');
23
+ // if (!path.length) return prev.concat(data);
24
+ // const indented = data.split('\n').map(line => (line.trim() ? ` ${line}` : line)).join('\n');
25
+ // return prev.concat(`${path}:\n${indented}`);
26
+ // }, '');
27
+
28
+ // return this.merge(Config.parseYaml(yaml));
29
+ // }
25
30
  };
@@ -2,53 +2,48 @@ const Merge = require('lodash.merge');
2
2
 
3
3
  function shq(s) { return `'${String(s).replace(/'/g, `'"'"'`)}'`; }
4
4
 
5
- exports.fetch = (req) => {
6
- return new Promise((resolve, reject) => {
7
- const { url, ...params } = exports.normalizeRequest({ ...req });
8
-
9
- fetch(url, params).then(async (res) => {
10
- const ct = res.headers.get('content-type') || '';
11
- const data = await (ct.includes('application/json') ? res.json() : res.text());
12
- return { res, data };
13
- }).then(resolve).catch(reject);
5
+ exports.fetch = (request) => {
6
+ return fetch(request).then(async (response) => {
7
+ const ct = response.headers.get('content-type') || '';
8
+ const data = await (ct.includes('application/json') ? response.json() : response.text());
9
+ return { response, data };
14
10
  });
15
11
  };
16
12
 
17
13
  exports.normalizeRequest = (req) => {
18
- req.path ??= '';
19
- req.method ??= 'get'; req.headers ??= {}; req.params ??= {};
20
- req.url += req.path;
21
- req.url = Object.entries(req.params).reduce((url, [key, value]) => { url.searchParams.append(key, value); return url; }, new URL(req.url)).toString();
14
+ req.path ??= ''; req.method ??= 'get'; req.headers ??= {}; req.params ??= {};
15
+ req.url = Object.entries(req.params).reduce((url, [key, value]) => { url.searchParams.append(key, value); return url; }, new URL(`${req.url}${req.path}`)).toString();
22
16
  req.headers = Object.entries(req.headers).reduce((prev, [key, value]) => Object.assign(prev, { [key.toLowerCase()]: value }), {});
23
17
  const [contentType] = req.headers['content-type']?.split(';') || [];
24
- const { data } = req; delete req.data;
25
- if (data == null) return req;
26
18
 
27
- switch (contentType) {
28
- case 'application/json': {
29
- req.body = JSON.stringify(data);
30
- break;
31
- }
32
- case 'application/x-www-form-urlencoded': {
33
- req.body = new URLSearchParams(data).toString();
34
- break;
35
- }
36
- case 'multipart/form-data': {
37
- delete req.headers['content-type'];
38
- // req.duplex = 'half';
39
- req.body = Object.entries(data).reduce((form, [key, value]) => {
40
- form.append(key, value);
41
- return form;
42
- }, new FormData());
43
- break;
44
- }
45
- default: {
46
- req.body = data;
47
- break;
19
+ if (req.data) {
20
+ switch (contentType) {
21
+ case 'application/json': {
22
+ req.body = JSON.stringify(req.data);
23
+ break;
24
+ }
25
+ case 'application/x-www-form-urlencoded': {
26
+ req.body = new URLSearchParams(req.data).toString();
27
+ break;
28
+ }
29
+ case 'multipart/form-data': {
30
+ delete req.headers['content-type'];
31
+ req.body = Object.entries(req.data).reduce((form, [key, value]) => {
32
+ form.append(key, value);
33
+ return form;
34
+ }, new FormData());
35
+ break;
36
+ }
37
+ default: {
38
+ req.body = req.data;
39
+ break;
40
+ }
48
41
  }
49
42
  }
50
43
 
51
- return req;
44
+ delete req.data; delete req.params;
45
+ const { url, ...params } = req;
46
+ return new Request(url, params);
52
47
  };
53
48
 
54
49
  exports.decorateRequest = (mergeData, key, request) => {
package/src/Sandman.js CHANGED
@@ -10,7 +10,7 @@ const ConfigClient = require('./ConfigClient');
10
10
  const resolveSymbol = Symbol('resolve');
11
11
 
12
12
  module.exports = class Sandman extends EventEmitter {
13
- #configClient; #configDir; #options; #watcher; #readline; #mergeData = {}; #cli;
13
+ #configClient; #configDir; #options; #watcher; #readline; #mergeData = {}; #cli; #cliCounter = 0;
14
14
  #captureCandidates = false; #candidates = []; #tabCounter = 0; #candidateIndex; #line; #lastToken;
15
15
 
16
16
  constructor(configDir, options) {
@@ -47,22 +47,24 @@ module.exports = class Sandman extends EventEmitter {
47
47
  #run(key) {
48
48
  const api = this.#get(key, {});
49
49
  if (!api?.request) return this.emit('error', { key, error: `Request "${key}" Not Found` });
50
- this.emit('request', { key, api });
50
+ this.emit('api', { api, key });
51
+ const request = FetchService.normalizeRequest(api.request);
52
+ this.emit('request', { request, api, key });
51
53
 
52
- return FetchService.fetch(api.request).then(({ res, data }) => {
53
- this.emit('response', { key, api, res, data });
54
- return { key, api, res, data };
54
+ return FetchService.fetch(request).then(({ response, data }) => {
55
+ this.emit('response', { response, api, key, data });
56
+ return { response, api, key, data };
55
57
  }).catch((error) => {
56
58
  this.emit('error', { key, api, error });
57
59
  return Promise.reject(error);
58
60
  }).then((results) => {
59
- return results.res.ok ? results : Promise.reject(results);
61
+ return results.response.ok ? results : Promise.reject(results);
60
62
  });
61
63
  }
62
64
 
63
65
  #prompt() {
64
66
  this.#readline.setPrompt(this.#configClient.get('prompt'));
65
- this.#readline.prompt();
67
+ this.#readline.prompt(true);
66
68
  return this;
67
69
  }
68
70
 
@@ -96,9 +98,12 @@ module.exports = class Sandman extends EventEmitter {
96
98
 
97
99
  if (typeof value === 'function') {
98
100
  return (...args) => {
101
+ self.#cliCounter++;
99
102
  self.#readline.pause();
100
- const result = value(...args);
101
- Promise.resolve().then(() => result).catch(() => null).finally(() => self.#prompt());
103
+ const result = value.apply(this, args);
104
+ Promise.resolve(result).catch(() => null).finally(() => setImmediate(() => {
105
+ if (--self.#cliCounter === 0) self.#prompt();
106
+ }));
102
107
  return result;
103
108
  };
104
109
  }
package/src/app.js DELETED
@@ -1,5 +0,0 @@
1
- const Sandman = require('./Sandman');
2
-
3
- module.exports = (configDir) => {
4
- return new Sandman(configDir);
5
- };