@shijiu/jsview 1.9.780 → 1.9.782

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shijiu/jsview",
3
- "version": "1.9.780",
3
+ "version": "1.9.782",
4
4
  "bin": {
5
5
  "jsview-post-build": "./tools/jsview-post-build.js",
6
6
  "jsview-post-install": "./tools/jsview-post-install.js"
package/tools/index.js ADDED
@@ -0,0 +1,209 @@
1
+ module.exports = function (args, opts) {
2
+ if (!opts) opts = {};
3
+
4
+ var flags = { bools : {}, strings : {} };
5
+
6
+ if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
7
+ flags.allBools = true;
8
+ } else {
9
+ [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
10
+ flags.bools[key] = true;
11
+ });
12
+ }
13
+
14
+ var aliases = {};
15
+ Object.keys(opts.alias || {}).forEach(function (key) {
16
+ aliases[key] = [].concat(opts.alias[key]);
17
+ aliases[key].forEach(function (x) {
18
+ aliases[x] = [key].concat(aliases[key].filter(function (y) {
19
+ return x !== y;
20
+ }));
21
+ });
22
+ });
23
+
24
+ [].concat(opts.string).filter(Boolean).forEach(function (key) {
25
+ flags.strings[key] = true;
26
+ if (aliases[key]) {
27
+ flags.strings[aliases[key]] = true;
28
+ }
29
+ });
30
+
31
+ var defaults = opts['default'] || {};
32
+
33
+ var argv = { _ : [] };
34
+ Object.keys(flags.bools).forEach(function (key) {
35
+ setArg(key, defaults[key] === undefined ? false : defaults[key]);
36
+ });
37
+
38
+ var notFlags = [];
39
+
40
+ if (args.indexOf('--') !== -1) {
41
+ notFlags = args.slice(args.indexOf('--')+1);
42
+ args = args.slice(0, args.indexOf('--'));
43
+ }
44
+
45
+ function setArg (key, val) {
46
+ var value = !flags.strings[key] && isNumber(val)
47
+ ? Number(val) : val
48
+ ;
49
+ setKey(argv, key.split('.'), value);
50
+
51
+ (aliases[key] || []).forEach(function (x) {
52
+ setKey(argv, x.split('.'), value);
53
+ });
54
+ }
55
+
56
+ for (var i = 0; i < args.length; i++) {
57
+ var arg = args[i];
58
+
59
+ if (/^--.+=/.test(arg)) {
60
+ // Using [\s\S] instead of . because js doesn't support the
61
+ // 'dotall' regex modifier. See:
62
+ // http://stackoverflow.com/a/1068308/13216
63
+ var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
64
+ setArg(m[1], m[2]);
65
+ }
66
+ else if (/^--no-.+/.test(arg)) {
67
+ var key = arg.match(/^--no-(.+)/)[1];
68
+ setArg(key, false);
69
+ }
70
+ else if (/^--.+/.test(arg)) {
71
+ var key = arg.match(/^--(.+)/)[1];
72
+ var next = args[i + 1];
73
+ if (next !== undefined && !/^-/.test(next)
74
+ && !flags.bools[key]
75
+ && !flags.allBools
76
+ && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
77
+ setArg(key, next);
78
+ i++;
79
+ }
80
+ else if (/^(true|false)$/.test(next)) {
81
+ setArg(key, next === 'true');
82
+ i++;
83
+ }
84
+ else {
85
+ setArg(key, flags.strings[key] ? '' : true);
86
+ }
87
+ }
88
+ else if (/^-[^-]+/.test(arg)) {
89
+ var letters = arg.slice(1,-1).split('');
90
+
91
+ var broken = false;
92
+ for (var j = 0; j < letters.length; j++) {
93
+ var next = arg.slice(j+2);
94
+
95
+ if (next === '-') {
96
+ setArg(letters[j], next)
97
+ continue;
98
+ }
99
+
100
+ if (/[A-Za-z]/.test(letters[j])
101
+ && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
102
+ setArg(letters[j], next);
103
+ broken = true;
104
+ break;
105
+ }
106
+
107
+ if (letters[j+1] && letters[j+1].match(/\W/)) {
108
+ setArg(letters[j], arg.slice(j+2));
109
+ broken = true;
110
+ break;
111
+ }
112
+ else {
113
+ setArg(letters[j], flags.strings[letters[j]] ? '' : true);
114
+ }
115
+ }
116
+
117
+ var key = arg.slice(-1)[0];
118
+ if (!broken && key !== '-') {
119
+ if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
120
+ && !flags.bools[key]
121
+ && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
122
+ setArg(key, args[i+1]);
123
+ i++;
124
+ }
125
+ else if (args[i+1] && /true|false/.test(args[i+1])) {
126
+ setArg(key, args[i+1] === 'true');
127
+ i++;
128
+ }
129
+ else {
130
+ setArg(key, flags.strings[key] ? '' : true);
131
+ }
132
+ }
133
+ }
134
+ else {
135
+ argv._.push(
136
+ flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
137
+ );
138
+ }
139
+ }
140
+
141
+ Object.keys(defaults).forEach(function (key) {
142
+ if (!hasKey(argv, key.split('.'))) {
143
+ setKey(argv, key.split('.'), defaults[key]);
144
+
145
+ (aliases[key] || []).forEach(function (x) {
146
+ setKey(argv, x.split('.'), defaults[key]);
147
+ });
148
+ }
149
+ });
150
+
151
+ if (opts['--']) {
152
+ argv['--'] = new Array();
153
+ notFlags.forEach(function(key) {
154
+ argv['--'].push(key);
155
+ });
156
+ }
157
+ else {
158
+ notFlags.forEach(function(key) {
159
+ argv._.push(key);
160
+ });
161
+ }
162
+
163
+ return argv;
164
+ };
165
+
166
+ function hasKey (obj, keys) {
167
+ var o = obj;
168
+ keys.slice(0,-1).forEach(function (key) {
169
+ o = (o[key] || {});
170
+ });
171
+
172
+ var key = keys[keys.length - 1];
173
+ return key in o;
174
+ }
175
+
176
+ function setKey (obj, keys, value) {
177
+ var o = obj;
178
+ for (var i = 0; i < keys.length-1; i++) {
179
+ var key = keys[i];
180
+ if (key === '__proto__') return;
181
+ if (o[key] === undefined) o[key] = {};
182
+ if (o[key] === Object.prototype || o[key] === Number.prototype
183
+ || o[key] === String.prototype) o[key] = {};
184
+ if (o[key] === Array.prototype) o[key] = [];
185
+ o = o[key];
186
+ }
187
+
188
+ var key = keys[keys.length - 1];
189
+ if (key === '__proto__') return;
190
+ if (o === Object.prototype || o === Number.prototype
191
+ || o === String.prototype) o = {};
192
+ if (o === Array.prototype) o = [];
193
+ if (o[key] === undefined || typeof o[key] === 'boolean') {
194
+ o[key] = value;
195
+ }
196
+ else if (Array.isArray(o[key])) {
197
+ o[key].push(value);
198
+ }
199
+ else {
200
+ o[key] = [ o[key], value ];
201
+ }
202
+ }
203
+
204
+ function isNumber (x) {
205
+ if (typeof x === 'number') return true;
206
+ if (/^0x[0-9a-f]+$/i.test(x)) return true;
207
+ return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
208
+ }
209
+
@@ -4,8 +4,91 @@
4
4
  const fs = require('fs');
5
5
  const path = require('path');
6
6
 
7
- function parseArguments(beginWithHyphen = true)
7
+ function printArgumentsUsages(requiredUsages, optionalUsages, helpUsages)
8
8
  {
9
+ let maxLength = 0;
10
+ for (const usage in requiredUsages) {
11
+ maxLength = (maxLength > usage.length ? maxLength : usage.length);
12
+ }
13
+ for (const usage in optionalUsages) {
14
+ maxLength = (maxLength > usage.length ? maxLength : usage.length);
15
+ }
16
+ for (const usage in helpUsages) {
17
+ maxLength = (maxLength > usage.length ? maxLength : usage.length);
18
+ }
19
+
20
+ console.log('Usages:');
21
+ for (const usage in requiredUsages) {
22
+ const spaceLength = maxLength - usage.length;
23
+ console.log();
24
+ console.log(' ' + usage + ': ' + ' '.repeat(spaceLength) + '[Required] ' + requiredUsages[usage]);
25
+ }
26
+ for (const usage in optionalUsages) {
27
+ const spaceLength = maxLength - usage.length;
28
+ console.log();
29
+ console.log(' ' + usage + ': ' + ' '.repeat(spaceLength) + '[Optional] ' + optionalUsages[usage]);
30
+ }
31
+ for (const usage in helpUsages) {
32
+ const spaceLength = maxLength - usage.length;
33
+ console.log();
34
+ console.log(' ' + usage + ': ' + ' '.repeat(spaceLength) + helpUsages[usage]);
35
+ }
36
+ console.log();
37
+ }
38
+
39
+ function parseArguments(requiredUsages = {},
40
+ optionalUsages = {},
41
+ withoutUnparsed = true)
42
+ {
43
+ const formatKey = (key) => {
44
+ let formattedKey = key.trim().replace(/^-*/, '');
45
+ formattedKey = formattedKey.replace(/-(.)/g, (x) => x[1].toUpperCase())
46
+ return formattedKey;
47
+ };
48
+ const formatValue = (value) => {
49
+ let formattedValue = (typeof(value) === 'string' ? value.trim() : value);
50
+ if (value === undefined
51
+ || value === null
52
+ || value === 'undefined'
53
+ || value === 'null'
54
+ || value === '') {
55
+ formattedValue = null;
56
+ }
57
+ return formattedValue;
58
+ }
59
+ const checkAliases = (aliases, options) => {
60
+ const formattedAliases = [];
61
+ for (const alias of aliases) {
62
+ const fmtAlias = formatKey(alias);
63
+ formattedAliases.push(fmtAlias);
64
+ }
65
+
66
+ let aliasValue = undefined;
67
+ let found = false;
68
+ for (const alias of formattedAliases) {
69
+ if (alias in options) {
70
+ aliasValue = options[alias];
71
+ found = true;
72
+ break;
73
+ }
74
+ }
75
+
76
+ if (found == false) {
77
+ return null;
78
+ }
79
+
80
+ const aliasedOptions = {};
81
+ for (const alias of formattedAliases) {
82
+ aliasedOptions[alias] = aliasValue;
83
+ }
84
+
85
+ return aliasedOptions;
86
+ };
87
+
88
+ const helpUsages = {
89
+ '-h | --help': 'Print help usages.',
90
+ }
91
+
9
92
  let options = {
10
93
  unparsed: []
11
94
  };
@@ -19,7 +102,7 @@ function parseArguments(beginWithHyphen = true)
19
102
  value = true;
20
103
  }
21
104
  if (key.startsWith('-') == false) {
22
- if (beginWithHyphen) {
105
+ if (withoutUnparsed) {
23
106
  console.error('Failed to parse argument: ' + argu);
24
107
  process.exit(1);
25
108
  } else {
@@ -28,21 +111,34 @@ function parseArguments(beginWithHyphen = true)
28
111
  }
29
112
  }
30
113
 
31
- let formattedKey = key.replace(/^-*/, '');
32
- formattedKey = formattedKey.replace(/-(.)/g, (x) => x[1].toUpperCase())
33
-
34
- let formattedValue = value;
35
- if (value === undefined
36
- || value === null
37
- || value === 'undefined'
38
- || value === 'null'
39
- || value === '') {
40
- formattedValue = null;
41
- }
42
-
114
+ let formattedKey = formatKey(key);
115
+ let formattedValue = formatValue(value);
43
116
  options[formattedKey] = formattedValue;
44
117
  }
45
118
 
119
+ for (const checker in helpUsages) {
120
+ const checkerList = checker.split('|');
121
+ const aliasedOptions = checkAliases(checkerList, options);
122
+ if (aliasedOptions) {
123
+ printArgumentsUsages(requiredUsages, optionalUsages, helpUsages);
124
+ process.exit(0);
125
+ }
126
+ }
127
+ for (const checker in requiredUsages) {
128
+ const checkerList = checker.split('|');
129
+ const aliasedOptions = checkAliases(checkerList, options);
130
+ if (!aliasedOptions) {
131
+ console.log('JsView Error: Failed to find required option: ' + checkerList);
132
+ process.exit(-1);
133
+ }
134
+ options = { ...options, ...aliasedOptions };
135
+ }
136
+ for (const checker in optionalUsages) {
137
+ const checkerList = checker.split('|');
138
+ const aliasedOptions = checkAliases(checkerList, options);
139
+ options = { ...options, ...aliasedOptions };
140
+ }
141
+
46
142
  return options;
47
143
  }
48
144
 
@@ -69,7 +165,7 @@ function parseArguments(beginWithHyphen = true)
69
165
  * │   │   └── jsview-vue-samples -> ../../../../@shijiu/jsview-vue-samples
70
166
  * └── src
71
167
  *    └── appConfig
72
- **************************************************/
168
+ *************************************************/
73
169
  function getOptions(framework)
74
170
  {
75
171
  const options = {};
@@ -111,16 +111,16 @@ function main(argv)
111
111
  server.listen(port, '0.0.0.0', () => {
112
112
  const ipAddrs = getIPAddress();
113
113
 
114
- console.log('');
114
+ console.log();
115
115
  console.log('SourceMap base url: ' + context.baseUrl)
116
- console.log('');
116
+ console.log();
117
117
  console.log('JsView server running at:');
118
- console.log('');
118
+ console.log();
119
119
  console.log(' - Local: http://localhost:' + port + '/');
120
120
  for(const ip of ipAddrs) {
121
121
  console.log(' - Network: http://' + ip + ':' + port + '/');
122
122
  }
123
- console.log('');
123
+ console.log();
124
124
  });
125
125
  }
126
126
 
@@ -170,5 +170,11 @@ function main(argv)
170
170
  doPostInstall(argv.framework, pkgNeedPatch, argv.skipCheckVersion);
171
171
  }
172
172
 
173
- const argv = parseArguments();
173
+ const requiredUsages = {
174
+ '--framework': 'Select from [vue|react]',
175
+ };
176
+ const optionalUsages = {
177
+ '--skip-check-version': 'Skip check patches version.'
178
+ };
179
+ const argv = parseArguments(requiredUsages, optionalUsages);
174
180
  main(argv);
@@ -63,7 +63,6 @@ function androidStartActivity(options)
63
63
  }
64
64
  }
65
65
 
66
- const argv = parseArguments(false);
67
66
  async function main(argv)
68
67
  {
69
68
  const options = await getExtraOptions(argv);
@@ -72,4 +71,11 @@ async function main(argv)
72
71
 
73
72
  androidStartActivity(options);
74
73
  }
74
+
75
+ const requiredUsages = {
76
+ '--framework': 'Select from [vue|react]',
77
+ };
78
+ const optionalUsages = {
79
+ };
80
+ const argv = parseArguments(requiredUsages, optionalUsages, false);
75
81
  main(argv)