@shijiu/jsview 1.9.782 → 1.9.825
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/dom/bin/jsview-browser-debug-dom.min.js +1 -1
- package/dom/bin/jsview-dom.min.js +1 -1
- package/dom/bin/jsview-engine-js-browser.min.js +1 -1
- package/dom/jsv-browser-debug-dom.js +6 -3
- package/dom/jsv-code-debug.mjs +5 -5
- package/dom/jsv-dom.js +5 -2
- package/dom/jsv-engine-js-browser.js +3 -0
- package/dom/jsv-forge-define.js +5 -2
- package/dom/target_core_revision.mjs +4 -4
- package/loader/jsview-browser-forgeapp.js +13 -0
- package/loader/jsview-loader.js +198 -0
- package/loader/jsview-main.js +14 -33
- package/loader/jsview-react-main.js +36 -0
- package/loader/{header_script_loader.js → jsview-react-script-loader.js} +0 -0
- package/package.json +1 -1
- package/patches/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +925 -921
- package/patches/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +1 -0
- package/patches/node_modules/postcss-js/objectifier.js +1 -0
- package/patches/node_modules/react-dev-utils/WebpackDevServerUtils.js +450 -0
- package/patches/node_modules/react-dev-utils/package.json +88 -0
- package/patches/node_modules/react-scripts/config/paths.js +17 -6
- package/patches/node_modules/react-scripts/config/webpack.config.js +36 -15
- package/patches/node_modules/vite/dist/node/chunks/dep-ed9cb113.js +12 -8
- package/patches/node_modules/vue-router/dist/vue-router.mjs +1 -0
- package/patches/node_modules/webpack-dev-server/client/utils/reloadApp.js +76 -0
- package/patches/node_modules/webpack-dev-server/client/utils/sendMessage.js +21 -0
- package/patches/node_modules/webpack-dev-server/package.json +141 -0
- package/tools/jsview-common.js +54 -21
- package/tools/jsview-post-build.js +16 -6
- package/tools/jsview-post-install.js +60 -9
- package/loader/jsview.default.config.js +0 -37
- package/loader/loader.js +0 -183
- package/loader/loader_webkit.js +0 -40
- package/tools/index.js +0 -209
|
@@ -6,8 +6,10 @@ const path = require('path');
|
|
|
6
6
|
const url = require('url');
|
|
7
7
|
const {
|
|
8
8
|
cpSync,
|
|
9
|
+
execCommand,
|
|
9
10
|
getOptions,
|
|
10
11
|
getPackageObject,
|
|
12
|
+
isSymlinkSync,
|
|
11
13
|
parseArguments,
|
|
12
14
|
symlinkSync,
|
|
13
15
|
rmSync
|
|
@@ -31,8 +33,37 @@ function checkNpmCommand()
|
|
|
31
33
|
|
|
32
34
|
function checkNpmLinkForDebug(options, linkablePkgNames)
|
|
33
35
|
{
|
|
34
|
-
|
|
36
|
+
// node 16 不会安装本地包的二次依赖, 需要手动安装。
|
|
37
|
+
let missingDepPkgs = '';
|
|
38
|
+
for (const linkableName of linkablePkgNames) {
|
|
39
|
+
const linkablePath = path.resolve(options.modulesDir, linkableName);
|
|
40
|
+
const linkablePkgObj = getPackageObject(linkablePath);
|
|
41
|
+
|
|
42
|
+
for (const dep in linkablePkgObj.dependencies ?? {}) {
|
|
43
|
+
const depPath = path.resolve(options.modulesDir, dep);
|
|
44
|
+
if (fs.existsSync(depPath)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const depPkg = dep + "@" + linkablePkgObj.dependencies[dep];
|
|
49
|
+
missingDepPkgs += ' ' + depPkg;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (const devDep in linkablePkgObj.devDependencies ?? {}) {
|
|
53
|
+
const devDepPath = path.resolve(options.modulesDir, devDep);
|
|
54
|
+
if (fs.existsSync(devDepPath)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const devDepPkg = devDep + "@" + linkablePkgObj.devDependencies[devDep];
|
|
59
|
+
missingDepPkgs += ' ' + devDepPkg;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
console.log('Install missing dependencies')
|
|
63
|
+
execCommand('npm install --no-save ' + missingDepPkgs);
|
|
35
64
|
|
|
65
|
+
// node 18 不会将本地依赖安装成链接,需要手动改成链接。
|
|
66
|
+
const pkgObj = getPackageObject(options.projectDir);
|
|
36
67
|
for (const linkableName of linkablePkgNames) {
|
|
37
68
|
let linkableTarget = pkgObj.dependencies?.[linkableName];
|
|
38
69
|
if (!linkableTarget || !linkableTarget.startsWith('file:')) {
|
|
@@ -41,9 +72,14 @@ function checkNpmLinkForDebug(options, linkablePkgNames)
|
|
|
41
72
|
|
|
42
73
|
linkableTarget = linkableTarget.replace('file:', '');
|
|
43
74
|
const linkableTargetPath = path.resolve(options.projectDir, linkableTarget);
|
|
75
|
+
if (isSymlinkSync(linkableTargetPath)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
44
79
|
const linkablePath = path.resolve(options.modulesDir, linkableName);
|
|
45
|
-
symlinkSync(linkableTargetPath, linkablePath);
|
|
80
|
+
symlinkSync(options.projectDir, linkableTargetPath, linkablePath);
|
|
46
81
|
}
|
|
82
|
+
|
|
47
83
|
}
|
|
48
84
|
|
|
49
85
|
function checkPatches(options, pkgNeedPatch, skipCheckVersion)
|
|
@@ -58,7 +94,7 @@ function checkPatches(options, pkgNeedPatch, skipCheckVersion)
|
|
|
58
94
|
const modulePkgDir = path.resolve(options.modulesDir, pkgName);
|
|
59
95
|
const modulePkgObj = getPackageObject(modulePkgDir);
|
|
60
96
|
if (modulePkgObj.version != patchPkgObj.version) {
|
|
61
|
-
console.error('Error: ' + pkgName + '@' + modulePkgObj.version + ' is not supported, required version is ' + patchPkgObj.version);
|
|
97
|
+
console.error('JsView Error: ' + pkgName + '@' + modulePkgObj.version + ' is not supported, required version is ' + patchPkgObj.version);
|
|
62
98
|
process.exit(1);
|
|
63
99
|
}
|
|
64
100
|
} else {
|
|
@@ -78,7 +114,7 @@ function installPatches(options, pkgNeedPatch)
|
|
|
78
114
|
}
|
|
79
115
|
|
|
80
116
|
console.info('\nCleanup node_modules cache... ');
|
|
81
|
-
rmSync(options.cacheDir);
|
|
117
|
+
rmSync(options.projectDir, options.cacheDir);
|
|
82
118
|
}
|
|
83
119
|
|
|
84
120
|
async function printRevision(options)
|
|
@@ -125,11 +161,24 @@ function doPostInstall(framework, pkgNeedPatch, skipCheckVersion)
|
|
|
125
161
|
|
|
126
162
|
const linkablePkgNames = [
|
|
127
163
|
'@shijiu/jsview',
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
'
|
|
131
|
-
|
|
132
|
-
|
|
164
|
+
];
|
|
165
|
+
switch (framework) {
|
|
166
|
+
case 'vue':
|
|
167
|
+
linkablePkgNames.push(
|
|
168
|
+
'@shijiu/jsview-vue',
|
|
169
|
+
'@shijiu/jsview-vue-samples',
|
|
170
|
+
)
|
|
171
|
+
break;
|
|
172
|
+
case 'react':
|
|
173
|
+
linkablePkgNames.push(
|
|
174
|
+
'@shijiu/jsview-react',
|
|
175
|
+
'@shijiu/jsview-react-samples',
|
|
176
|
+
)
|
|
177
|
+
break;
|
|
178
|
+
default:
|
|
179
|
+
console.error('JsView Error: Bad framework: ' + framework);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
133
182
|
|
|
134
183
|
checkNpmCommand();
|
|
135
184
|
|
|
@@ -159,8 +208,10 @@ function main(argv)
|
|
|
159
208
|
break;
|
|
160
209
|
case 'react':
|
|
161
210
|
pkgNeedPatch = [
|
|
211
|
+
'react-dev-utils',
|
|
162
212
|
'react-dom',
|
|
163
213
|
'react-scripts',
|
|
214
|
+
'webpack-dev-server',
|
|
164
215
|
];
|
|
165
216
|
break;
|
|
166
217
|
default:
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
jsviewConfig: {
|
|
3
|
-
// (可选配置)localStorage支持
|
|
4
|
-
// domain可以为任意字符串,各Domain的localStorage互相隔离, 默认值是hostname
|
|
5
|
-
// presetKeys为预置key,可以直接使用localStorage.xxx的形式,避免undefined错误
|
|
6
|
-
localStorage: {
|
|
7
|
-
domain: "default",
|
|
8
|
-
presetKeys: [
|
|
9
|
-
"value1",
|
|
10
|
-
"value2"
|
|
11
|
-
],
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
// (可选配置)填写main.js或者bundle.js相对于index.html的相对位置,
|
|
15
|
-
// 用于image/import.then的相对寻址, vue3默认值是/js/
|
|
16
|
-
jsSubPath: "/js/",
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
vendorConfig: {
|
|
20
|
-
// (可选配置)设置屏幕坐标映射值,screenWidth为屏幕画布定义的宽度,displayScale为清晰度,
|
|
21
|
-
// 默认值是画布宽度1280px, 清晰度为1.0
|
|
22
|
-
designedMap: {
|
|
23
|
-
screenWidth: 1280,
|
|
24
|
-
displayScale: 1.0
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
// (可选配置)按键接受的扩展,例如将静音按键(JAVA键值为164)映射为JS键值20001,
|
|
28
|
-
// PS:注意"164"的引号
|
|
29
|
-
bindKeys: {
|
|
30
|
-
keys: {
|
|
31
|
-
"164": 20001
|
|
32
|
-
},
|
|
33
|
-
syncKeys: {
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
}
|
|
37
|
-
}
|
package/loader/loader.js
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import initHeaderScriptLoader from "./header_script_loader";
|
|
2
|
-
import TargetRevision from "../dom/target_core_revision"
|
|
3
|
-
import AppData from '/src/appConfig/app.config'
|
|
4
|
-
|
|
5
|
-
// Forge define
|
|
6
|
-
if (typeof window.Forge === 'undefined') { window.Forge = {}; }
|
|
7
|
-
const Forge = window.Forge;
|
|
8
|
-
|
|
9
|
-
function initDesignedMap(input_designed_map) {
|
|
10
|
-
window.Forge.DesignMap = function () {
|
|
11
|
-
let designMap = { width: 1280, displayScale: 1.0 };
|
|
12
|
-
try {
|
|
13
|
-
if (input_designed_map) {
|
|
14
|
-
const new_designed_map = {
|
|
15
|
-
width: input_designed_map.screenWidth,
|
|
16
|
-
displayScale: input_designed_map.displayScale
|
|
17
|
-
};
|
|
18
|
-
designMap = new_designed_map;
|
|
19
|
-
}
|
|
20
|
-
} catch (e) {
|
|
21
|
-
console.error("load designed map failed");
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// 设置播放器的屏幕坐标尺寸
|
|
25
|
-
if (window.JsView && window.JsView.setVideoDesignMapWidth) {
|
|
26
|
-
window.JsView.setVideoDesignMapWidth(designMap.width);
|
|
27
|
-
} else {
|
|
28
|
-
// 借助Audio标签设置基类BaseMedia的屏幕尺寸配置,绕开react的unref语法检测
|
|
29
|
-
if (Audio.setDesignMapWidth) {
|
|
30
|
-
Audio.setDesignMapWidth(designMap.width);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return designMap;
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// eslint-disable-next-line no-unused-vars
|
|
39
|
-
let sJsViewForgeAppDefine = null;
|
|
40
|
-
async function selectJsViewRuntime(js_sub_path, input_designed_map, app_name) {
|
|
41
|
-
// 初始Forge的启动入口
|
|
42
|
-
initEntry();
|
|
43
|
-
|
|
44
|
-
initDesignedMap(input_designed_map);
|
|
45
|
-
if (window.JsView) {
|
|
46
|
-
if (app_name && window.JsView.notifyAppName) {
|
|
47
|
-
window.JsView.notifyAppName(app_name);
|
|
48
|
-
}
|
|
49
|
-
initHeaderScriptLoader(js_sub_path);
|
|
50
|
-
let { domNative } = await import("../dom/jsv-dom.js");
|
|
51
|
-
sJsViewForgeAppDefine = domNative.JsViewForgeApp;
|
|
52
|
-
window.JsView.ForgeExt = domNative.ForgeExtension;
|
|
53
|
-
window.JsView.Dom.JsSubPath = js_sub_path;
|
|
54
|
-
} else {
|
|
55
|
-
// 在PC环境下没有处理加载EngineJs, 所以在此加载一下
|
|
56
|
-
await import("../dom/jsv-engine-js-browser.js");
|
|
57
|
-
|
|
58
|
-
// 加载jsv-dom的调试版本
|
|
59
|
-
await import("../dom/jsv-browser-debug-dom.js");
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// 当confirmEntry和Forge.RunApp都被调用完成后,才会进行JsViewForgeApp运行
|
|
64
|
-
// eslint-disable-next-line no-var
|
|
65
|
-
let sActivityManager = null;
|
|
66
|
-
// eslint-disable-next-line no-var
|
|
67
|
-
let sEntryConfirmed = false;
|
|
68
|
-
let sJsViewApp = null;
|
|
69
|
-
|
|
70
|
-
function startForgeApp() {
|
|
71
|
-
if (sActivityManager !== null && sEntryConfirmed) {
|
|
72
|
-
console.log("Forge.RunApp().");
|
|
73
|
-
// eslint-disable-next-line new-cap
|
|
74
|
-
sJsViewApp = new sJsViewForgeAppDefine(sActivityManager);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function confirmEntry() {
|
|
79
|
-
sEntryConfirmed = true;
|
|
80
|
-
if (window.JsView) {
|
|
81
|
-
checkEngineVersion();
|
|
82
|
-
}
|
|
83
|
-
startForgeApp();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function initEntry() {
|
|
87
|
-
Forge.RunApp = function (activity_manager) {
|
|
88
|
-
console.log("Call from Forge.Run");
|
|
89
|
-
sActivityManager = activity_manager;
|
|
90
|
-
startForgeApp();
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async function runMain() {
|
|
95
|
-
console.log("main.js loaded...");
|
|
96
|
-
|
|
97
|
-
// 确定并进行Forge模块的启动
|
|
98
|
-
confirmEntry();
|
|
99
|
-
|
|
100
|
-
console.log("main.js done...");
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function checkEngineVersion() {
|
|
104
|
-
// 检查配套引擎的版本
|
|
105
|
-
if (
|
|
106
|
-
window.JsView.CodeRevision !== TargetRevision.CoreRevision /* Native引擎版本(由APK启动参数 CORE 决定) */ ||
|
|
107
|
-
window.Forge.Version !== TargetRevision.JseRevision /* JS引擎版本(由APK启动参数 ENGINEJS 决定) */
|
|
108
|
-
) {
|
|
109
|
-
console.warn(
|
|
110
|
-
`Warning: JsView Engine version miss matched, some effect will be lost. url should be ${TargetRevision.JseUrl}`
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function getHostName() {
|
|
116
|
-
const full_url = window.location.href;
|
|
117
|
-
let idx = full_url.indexOf("://");
|
|
118
|
-
// const protocol = (idx > 0 ? full_url.substring(0, idx + 1) : "");
|
|
119
|
-
const host_path = idx > 1 ? full_url.substring(idx + 3) : "";
|
|
120
|
-
|
|
121
|
-
idx = host_path.indexOf("/");
|
|
122
|
-
const host = idx > 0 ? host_path.substring(0, idx) : "";
|
|
123
|
-
|
|
124
|
-
return host;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async function startApp(config, onLoaded) {
|
|
128
|
-
console.log("StartApp...");
|
|
129
|
-
if (window.JsView) {
|
|
130
|
-
// 运行在JsView引擎中
|
|
131
|
-
|
|
132
|
-
// (可选配置)按键接受的扩展,例如将静音按键(JAVA键值为164)映射为JS键值20001,PS:注意"164"的引号
|
|
133
|
-
window.JsView.addKeysMap(config.vendorConfig.bindKeys);
|
|
134
|
-
|
|
135
|
-
// (可选配置)localStorage支持
|
|
136
|
-
let storageDomain = config.jsviewConfig.localStorage.domain;
|
|
137
|
-
if(storageDomain == "default") {
|
|
138
|
-
storageDomain = getHostName();
|
|
139
|
-
}
|
|
140
|
-
window.JsView.setStorageDomain(storageDomain); // Domain可以为任意字符串,各Domain的localStorage互相隔离
|
|
141
|
-
window.JsView.enableStorageNames(...config.jsviewConfig.localStorage.presetKeys);
|
|
142
|
-
|
|
143
|
-
// (可选设置)cookies的支持
|
|
144
|
-
let cookies_domain = config.jsviewConfig.cookies?.domain;
|
|
145
|
-
if (cookies_domain) {
|
|
146
|
-
console.log("Enable cookie for domain " + cookies_domain);
|
|
147
|
-
window.JsView.setCookieDomain?.(cookies_domain);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// JsView Dom相关配置
|
|
151
|
-
window.JsView.Dom.Render = function () {
|
|
152
|
-
onLoaded()
|
|
153
|
-
};
|
|
154
|
-
} else {
|
|
155
|
-
await onLoaded()
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
async function loadJsViewEnv(config, onLoaded) {
|
|
160
|
-
// 参数说明:
|
|
161
|
-
// /static/js/: (可选配置)填写main.js或者bundle.js相对于index.html的相对位置,用于image/import.then的相对寻址
|
|
162
|
-
// {screenWidth:1280, displayScale:1.0}: (可选配置)设置屏幕坐标映射值,前者为屏幕画布定义的宽度,后者为清晰度,
|
|
163
|
-
// 默认值是画布宽度1280px, 清晰度为1.0
|
|
164
|
-
await selectJsViewRuntime(config.jsviewConfig.jsSubPath,
|
|
165
|
-
config.vendorConfig.designedMap,
|
|
166
|
-
AppData.AppName);
|
|
167
|
-
|
|
168
|
-
// if (!window.JsView) {
|
|
169
|
-
// await import("../utils/JsViewVueWidget/BrowserDebugWidget/WidgetLoader");
|
|
170
|
-
// await import("../utils/JsViewPlugin/BrowserPluginLoader");
|
|
171
|
-
// }
|
|
172
|
-
|
|
173
|
-
await startApp(config, onLoaded);
|
|
174
|
-
|
|
175
|
-
// 环境启动后,动态加载React框架和main
|
|
176
|
-
runMain();
|
|
177
|
-
|
|
178
|
-
console.log("index.js loaded AppName=" + AppData.AppName);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export {
|
|
182
|
-
loadJsViewEnv,
|
|
183
|
-
};
|
package/loader/loader_webkit.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
window.JsvDisableReactWrapper = true; // 设置标识位,有部分高阶组件根据此标识位决定元素的搭建方式
|
|
2
|
-
|
|
3
|
-
// Forge define
|
|
4
|
-
if (typeof window.Forge === 'undefined') { window.Forge = {}; }
|
|
5
|
-
const Forge = window.Forge;
|
|
6
|
-
|
|
7
|
-
// const sForgeReactAppDefine = null;
|
|
8
|
-
function loadJsViewProxy(callback, js_sub_path) {
|
|
9
|
-
callback();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// 当confirmEntry和Forge.RunApp都被调用完成后,才会进行ForgeReactApp运行
|
|
13
|
-
let sActivityManager = null;
|
|
14
|
-
let sEntryConfirmed = false;
|
|
15
|
-
// let sReactApp = null;
|
|
16
|
-
|
|
17
|
-
function startForgeApp() {
|
|
18
|
-
if (sActivityManager !== null && sEntryConfirmed) {
|
|
19
|
-
console.log("Forge.RunApp().");
|
|
20
|
-
// sReactApp = new sForgeReactAppDefine(sActivityManager);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function confirmEntry() {
|
|
25
|
-
sEntryConfirmed = true;
|
|
26
|
-
startForgeApp();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function initEntry() {
|
|
30
|
-
Forge.RunApp = function (activity_manager) {
|
|
31
|
-
sActivityManager = activity_manager;
|
|
32
|
-
startForgeApp();
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export {
|
|
37
|
-
loadJsViewProxy,
|
|
38
|
-
initEntry,
|
|
39
|
-
confirmEntry
|
|
40
|
-
};
|
package/tools/index.js
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
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
|
-
|