@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.
Files changed (34) hide show
  1. package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
  2. package/dom/bin/jsview-dom.min.js +1 -1
  3. package/dom/bin/jsview-engine-js-browser.min.js +1 -1
  4. package/dom/jsv-browser-debug-dom.js +6 -3
  5. package/dom/jsv-code-debug.mjs +5 -5
  6. package/dom/jsv-dom.js +5 -2
  7. package/dom/jsv-engine-js-browser.js +3 -0
  8. package/dom/jsv-forge-define.js +5 -2
  9. package/dom/target_core_revision.mjs +4 -4
  10. package/loader/jsview-browser-forgeapp.js +13 -0
  11. package/loader/jsview-loader.js +198 -0
  12. package/loader/jsview-main.js +14 -33
  13. package/loader/jsview-react-main.js +36 -0
  14. package/loader/{header_script_loader.js → jsview-react-script-loader.js} +0 -0
  15. package/package.json +1 -1
  16. package/patches/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +925 -921
  17. package/patches/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +1 -0
  18. package/patches/node_modules/postcss-js/objectifier.js +1 -0
  19. package/patches/node_modules/react-dev-utils/WebpackDevServerUtils.js +450 -0
  20. package/patches/node_modules/react-dev-utils/package.json +88 -0
  21. package/patches/node_modules/react-scripts/config/paths.js +17 -6
  22. package/patches/node_modules/react-scripts/config/webpack.config.js +36 -15
  23. package/patches/node_modules/vite/dist/node/chunks/dep-ed9cb113.js +12 -8
  24. package/patches/node_modules/vue-router/dist/vue-router.mjs +1 -0
  25. package/patches/node_modules/webpack-dev-server/client/utils/reloadApp.js +76 -0
  26. package/patches/node_modules/webpack-dev-server/client/utils/sendMessage.js +21 -0
  27. package/patches/node_modules/webpack-dev-server/package.json +141 -0
  28. package/tools/jsview-common.js +54 -21
  29. package/tools/jsview-post-build.js +16 -6
  30. package/tools/jsview-post-install.js +60 -9
  31. package/loader/jsview.default.config.js +0 -37
  32. package/loader/loader.js +0 -183
  33. package/loader/loader_webkit.js +0 -40
  34. 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
- const pkgObj = getPackageObject(options.projectDir);
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
- '@shijiu/jsview-vue',
129
- '@shijiu/jsview-vue-samples',
130
- '@shijiu/jsview-react',
131
- '@shijiu/jsview-react-samples',
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
- };
@@ -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
-