jh5_app_build 1.0.30 → 1.0.31

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/lib/build_japp.js CHANGED
@@ -52,7 +52,7 @@ module.exports = async (cmd, buildCfg) => {
52
52
  // 修改版本号
53
53
  try {
54
54
  console.log(`change dist ver ...`);
55
- var repFile = `${buildCfg.rootPath}\\dist\\index.html`;
55
+ var repFile = `${buildCfg.rootPath}/dist/index.html`;
56
56
  var indexStr = fs.readFileSync(repFile, "utf8");
57
57
  indexStr = indexStr.replace(/#J_APPNAME#/g, buildCfg.appName);
58
58
  indexStr = indexStr.replace(/#J_DATE#/g, buildCfg.dateStr);
package/lib/build_std.js CHANGED
@@ -5,10 +5,11 @@ let archiver = require('archiver');
5
5
  let jutils = require('base_parts');
6
6
 
7
7
  let fs = require('fs');
8
- let path = require('path');
9
- let os = require('os');
10
- let AdmZip = require('adm-zip');
11
- let child_process = require('child_process');
8
+ let path = require('path');
9
+ let os = require('os');
10
+ let AdmZip = require('adm-zip');
11
+ let child_process = require('child_process');
12
+ let inquirer = require('inquirer');
12
13
 
13
14
 
14
15
  function adler32_buf(buf, seed) {
@@ -101,18 +102,166 @@ async function copyReNameDir(srcDir, destDir, pkgName) {
101
102
  }
102
103
  }
103
104
 
104
- /**
105
- * 创建目录并获取尾部带斜线的路径
106
- * @param {string} dirPath 路径
107
- * @returns {string} 路径(尾部带斜线)
108
- */
109
- function makeAndGetDir(dirPath) {
110
- try {
111
- fs.mkdirSync(dirPath);
112
- } catch (error) {
113
- }
114
- return path.resolve(dirPath) + "\\";
115
- }
105
+ /**
106
+ * 创建目录并获取尾部带斜线的路径
107
+ * @param {string} dirPath 路径
108
+ * @returns {string} 路径(尾部带斜线)
109
+ */
110
+ function makeAndGetDir(dirPath) {
111
+ try {
112
+ fs.mkdirSync(dirPath);
113
+ } catch (error) {
114
+ }
115
+ return path.resolve(dirPath) + path.sep;
116
+ }
117
+
118
+ /**
119
+ * 获取本机工具缓存文件路径
120
+ * @returns {string} 缓存文件路径
121
+ */
122
+ function getMacToolCachePath() {
123
+ return path.join(os.homedir(), ".jh5_app_build", "apk_tools_macos.json");
124
+ }
125
+
126
+ /**
127
+ * 读取macOS工具根目录缓存
128
+ * @returns {string} 上次输入的工具根目录
129
+ */
130
+ function readMacToolRootCache() {
131
+ try {
132
+ var cacheObj = JSON.parse(fs.readFileSync(getMacToolCachePath(), "utf8"));
133
+ return cacheObj && cacheObj.toolRoot ? cacheObj.toolRoot : "";
134
+ } catch (error) {
135
+ }
136
+ return "";
137
+ }
138
+
139
+ /**
140
+ * 保存macOS工具根目录缓存
141
+ * @param {string} toolRoot 工具根目录
142
+ * @returns {void}
143
+ */
144
+ function saveMacToolRootCache(toolRoot) {
145
+ try {
146
+ var cachePath = getMacToolCachePath();
147
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
148
+ fs.writeFileSync(cachePath, JSON.stringify({
149
+ toolRoot: toolRoot
150
+ }, null, 4), "utf8");
151
+ } catch (error) {
152
+ }
153
+ }
154
+
155
+ /**
156
+ * 判断路径是否为可用文件
157
+ * @param {string} filePath 文件路径
158
+ * @returns {boolean} 是否存在文件
159
+ */
160
+ function isValidFile(filePath) {
161
+ try {
162
+ return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
163
+ } catch (error) {
164
+ }
165
+ return false;
166
+ }
167
+
168
+ /**
169
+ * 根据工具根目录和架构生成macOS工具路径
170
+ * @param {string} toolRoot 工具总目录
171
+ * @returns {*} 工具路径对象
172
+ */
173
+ function getMacToolPathsByRoot(toolRoot) {
174
+ // 根据当前Mac架构选择对应工具目录
175
+ var archDirName = process.arch === "arm64" ? "bin_apple" : "bin_intel";
176
+ var archRoot = path.join(path.resolve(toolRoot), archDirName);
177
+ return {
178
+ root: path.resolve(toolRoot),
179
+ archRoot: archRoot,
180
+ cwd: path.join(archRoot, "jre", "bin"),
181
+ java: path.join(archRoot, "jre", "bin", "java"),
182
+ keytool: path.join(archRoot, "jre", "bin", "keytool"),
183
+ jarsigner: path.join(archRoot, "jre", "bin", "jarsigner"),
184
+ zipalign: path.join(archRoot, "android_build_tools", "zipalign"),
185
+ apktool: path.join(archRoot, "h5_bin", "apktool.jar")
186
+ };
187
+ }
188
+
189
+ /**
190
+ * 校验macOS打包工具是否完整
191
+ * @param {*} toolPaths 工具路径对象
192
+ * @returns {boolean} 是否完整
193
+ */
194
+ function validMacToolPaths(toolPaths) {
195
+ return isValidFile(toolPaths.java)
196
+ && isValidFile(toolPaths.keytool)
197
+ && isValidFile(toolPaths.jarsigner)
198
+ && isValidFile(toolPaths.zipalign)
199
+ && isValidFile(toolPaths.apktool);
200
+ }
201
+
202
+ /**
203
+ * 设置macOS命令行工具执行权限
204
+ * @param {*} toolPaths 工具路径对象
205
+ * @returns {void}
206
+ */
207
+ function chmodMacTools(toolPaths) {
208
+ [toolPaths.java, toolPaths.keytool, toolPaths.jarsigner, toolPaths.zipalign].forEach((filePath) => {
209
+ try {
210
+ fs.chmodSync(filePath, 0o755);
211
+ } catch (error) {
212
+ }
213
+ });
214
+ }
215
+
216
+ /**
217
+ * 获取macOS打包工具路径
218
+ * @returns {Promise<*>} 工具路径对象
219
+ */
220
+ async function getMacApkTools() {
221
+ // 只输入一次总目录,具体工具按目录规范自动拼接
222
+ while (true) {
223
+ var cacheRoot = readMacToolRootCache();
224
+ var answers = await inquirer.prompt([
225
+ {
226
+ type: 'input',
227
+ name: 'toolRoot',
228
+ message: 'Please input macOS APK tools root path:',
229
+ default: cacheRoot
230
+ }
231
+ ]);
232
+ var toolRoot = path.resolve((answers.toolRoot || cacheRoot || "").trim());
233
+ var toolPaths = getMacToolPathsByRoot(toolRoot);
234
+ if (validMacToolPaths(toolPaths)) {
235
+ chmodMacTools(toolPaths);
236
+ saveMacToolRootCache(toolRoot);
237
+ console.log("[macOS APK tools] " + toolPaths.archRoot);
238
+ return toolPaths;
239
+ }
240
+ console.error("macOS APK tools path invalid, please check: " + toolPaths.archRoot);
241
+ }
242
+ }
243
+
244
+ /**
245
+ * 获取APK打包工具路径
246
+ * @returns {Promise<*>} 工具路径对象
247
+ */
248
+ async function getApkTools() {
249
+ if (process.platform === "darwin") {
250
+ return await getMacApkTools();
251
+ }
252
+
253
+ // Windows保持原有固定工具目录
254
+ return {
255
+ root: "C:\\jdev_develop",
256
+ archRoot: "C:\\jdev_develop",
257
+ cwd: "C:\\jdev_develop\\jre\\bin",
258
+ java: "C:\\jdev_develop\\jre\\bin\\java.exe",
259
+ keytool: "C:\\jdev_develop\\jre\\bin\\keytool.exe",
260
+ jarsigner: "C:\\jdev_develop\\jre\\bin\\jarsigner.exe",
261
+ zipalign: "C:\\jdev_develop\\jre\\bin\\zipalign.exe",
262
+ apktool: "C:\\jdev_develop\\h5_bin\\apktool.jar"
263
+ };
264
+ }
116
265
 
117
266
  /**
118
267
  * 创建目录并复制文件
@@ -128,13 +277,13 @@ async function makeDirAndCopy(srcFile, dstFile) {
128
277
  module.exports = async (cmd, buildCfg) => {
129
278
  console.log(`build file to ${buildCfg.outpath}`);
130
279
 
131
- try {
132
- // 模板目录
133
- var stdBinPriDir = `${buildCfg.rootPath}/jbuild_data/std_bins`;
134
- var stdBinDir = `${buildCfg.rootPath}/jbuild_data/std_out`;
135
-
136
- // jre目录
137
- let jreCwd = "C:\\jdev_develop\\jre\\bin";
280
+ try {
281
+ // 模板目录
282
+ var stdBinPriDir = `${buildCfg.rootPath}/jbuild_data/std_bins`;
283
+ var stdBinDir = `${buildCfg.rootPath}/jbuild_data/std_out`;
284
+
285
+ // APK打包工具
286
+ let apkTools = await getApkTools();
138
287
 
139
288
  // apk配置
140
289
  let apkConfig = makeAndGetDir(`${buildCfg.rootPath}/apk_cfg`);
@@ -156,18 +305,18 @@ module.exports = async (cmd, buildCfg) => {
156
305
  await jfile_utils.mkdir(stdBinDir);
157
306
 
158
307
  // 存在自定义apk
159
- var custumApk = `${buildCfg.rootPath}/apk_cfg/app-release.apk`
160
- if (fs.existsSync(custumApk)) {
161
- console.warn(`exists custum Apk, unpack custum apk...`);
162
- child_process.execFileSync("C:\\jdev_develop\\jre\\bin\\java.exe", [
163
- "-jar", "C:\\jdev_develop\\h5_bin\\apktool.jar",
164
- "d", custumApk,
165
- "-r", "-s", "-f",
166
- "-o", stdBinDir
167
- ], {
168
- cwd: jreCwd
169
- });
170
- }
308
+ var custumApk = `${buildCfg.rootPath}/apk_cfg/app-release.apk`
309
+ if (fs.existsSync(custumApk)) {
310
+ console.warn(`exists custum Apk, unpack custum apk...`);
311
+ child_process.execFileSync(apkTools.java, [
312
+ "-jar", apkTools.apktool,
313
+ "d", custumApk,
314
+ "-r", "-s", "-f",
315
+ "-o", stdBinDir
316
+ ], {
317
+ cwd: apkTools.cwd
318
+ });
319
+ }
171
320
  else {
172
321
  // 修改应用名
173
322
  if (apkinfoObj.pkgName) {
@@ -190,10 +339,10 @@ module.exports = async (cmd, buildCfg) => {
190
339
 
191
340
  // 修改版本号
192
341
  let platformVer = jutils.getUUID();
193
- try {
194
- console.log(`change dist ver ...`);
195
- let repFile = `${buildCfg.rootPath}\\dist\\index.html`;
196
- let indexStr = fs.readFileSync(repFile, "utf8");
342
+ try {
343
+ console.log(`change dist ver ...`);
344
+ let repFile = path.join(buildCfg.rootPath, "dist", "index.html");
345
+ let indexStr = fs.readFileSync(repFile, "utf8");
197
346
  indexStr = indexStr.replace(/#J_APPNAME#/g, buildCfg.appName);
198
347
  indexStr = indexStr.replace(/#J_DATE#/g, buildCfg.dateStr);
199
348
 
@@ -417,59 +566,59 @@ module.exports = async (cmd, buildCfg) => {
417
566
  }
418
567
 
419
568
  // 打包
420
- console.log(`making apk...`);
421
- child_process.execFileSync("C:\\jdev_develop\\jre\\bin\\java.exe", [
422
- "-jar", "C:\\jdev_develop\\h5_bin\\apktool.jar",
423
- "b", stdBinDir,
424
- "-o", buildCfg.outpath
425
- ], {
426
- cwd: jreCwd
427
- });
569
+ console.log(`making apk...`);
570
+ child_process.execFileSync(apkTools.java, [
571
+ "-jar", apkTools.apktool,
572
+ "b", stdBinDir,
573
+ "-o", buildCfg.outpath
574
+ ], {
575
+ cwd: apkTools.cwd
576
+ });
428
577
 
429
578
  // 生成apk签名
430
579
  let keyStoreFile = `${apkConfig}/apk_cert.keystore`;
431
580
  if (!fs.existsSync(keyStoreFile)) {
432
- console.log(`not find keystore,making ...`);
433
- // 生成签名
434
- child_process.execFileSync("C:\\jdev_develop\\jre\\bin\\keytool.exe", [
435
- "-genkey",
436
- "-storepass", "123456",
581
+ console.log(`not find keystore,making ...`);
582
+ // 生成签名
583
+ child_process.execFileSync(apkTools.keytool, [
584
+ "-genkey",
585
+ "-storepass", "123456",
437
586
  "-keypass", "123456",
438
587
  "-alias", "cert",
439
588
  "-keyalg", "RSA",
440
589
  "-validity", "20000",
441
- "-keystore", keyStoreFile,
442
- "-dname", "CN=10.10.6.100,OU=utils,O=utils,L=beijing,ST=beijing,c=cn"
443
- ], {
444
- cwd: jreCwd
445
- });
446
- }
590
+ "-keystore", keyStoreFile,
591
+ "-dname", "CN=10.10.6.100,OU=utils,O=utils,L=beijing,ST=beijing,c=cn"
592
+ ], {
593
+ cwd: apkTools.cwd
594
+ });
595
+ }
447
596
 
448
597
  // 签名
449
- console.log(`sign apk ...`);
450
- var singApkTmp = buildCfg.outpath + "_sign.apk";
451
- child_process.execFileSync("C:\\jdev_develop\\jre\\bin\\jarsigner.exe", [
452
- "-verbose",
453
- "-storepass", "123456",
598
+ console.log(`sign apk ...`);
599
+ var singApkTmp = buildCfg.outpath + "_sign.apk";
600
+ child_process.execFileSync(apkTools.jarsigner, [
601
+ "-verbose",
602
+ "-storepass", "123456",
454
603
  "-keypass", "123456",
455
604
  "-keystore", keyStoreFile,
456
605
  "-signedjar", singApkTmp,
457
- buildCfg.outpath,
458
- "cert"
459
- ], {
460
- cwd: jreCwd
461
- });
606
+ buildCfg.outpath,
607
+ "cert"
608
+ ], {
609
+ cwd: apkTools.cwd
610
+ });
462
611
  fs.unlinkSync(buildCfg.outpath); // 删除未签名的
463
612
 
464
- // 对齐apk
465
- console.log(`zip align ...`);
466
- child_process.execFileSync("C:\\jdev_develop\\jre\\bin\\zipalign.exe", [
467
- "-v", "4",
468
- singApkTmp,
469
- buildCfg.outpath
470
- ], {
471
- cwd: jreCwd
472
- });
613
+ // 对齐apk
614
+ console.log(`zip align ...`);
615
+ child_process.execFileSync(apkTools.zipalign, [
616
+ "-v", "4",
617
+ singApkTmp,
618
+ buildCfg.outpath
619
+ ], {
620
+ cwd: apkTools.cwd
621
+ });
473
622
  fs.unlinkSync(singApkTmp); // 删除未对齐的
474
623
 
475
624
  // 完成
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "jh5_app_build",
3
- "version": "1.0.30",
3
+ "version": "1.0.31",
4
4
  "description": "jaskle jh5_app_build",
5
5
  "main": "./bin/jh5_app_build.js",
6
+ "files": [
7
+ "bin/",
8
+ "config/",
9
+ "lib/"
10
+ ],
6
11
  "registry": true,
7
12
  "directories": {},
8
13
  "scripts": {
package/.eslintrc.js DELETED
@@ -1,264 +0,0 @@
1
- module.exports = {
2
- "env": {
3
- "node" : true,
4
- "browser": true,
5
- "commonjs": true,
6
- "es6": true,
7
- "mocha" : true
8
- },
9
- "parserOptions": {
10
- "ecmaVersion": 8
11
- // "sourceType": "module",
12
- // "ecmaFeatures": {
13
- // "jsx": true
14
- // }
15
- },
16
- "extends": "eslint:recommended",
17
- "rules": {
18
- "accessor-pairs": "error",
19
- "array-bracket-newline": "error",
20
- "array-bracket-spacing": "error",
21
- "array-callback-return": "error",
22
- "array-element-newline": "off",
23
- "arrow-body-style": "off",
24
- "arrow-parens": [
25
- "error",
26
- "always"
27
- ],
28
- "arrow-spacing": "warn",
29
- "block-scoped-var": "off",
30
- "block-spacing": [
31
- "error",
32
- "always"
33
- ],
34
- "brace-style": "off",
35
- "callback-return": "error",
36
- "camelcase": "off",
37
- "capitalized-comments": "off",
38
- "class-methods-use-this": "off",
39
- "comma-dangle": "error",
40
- "comma-spacing": "off",
41
- "comma-style": [
42
- "error",
43
- "last"
44
- ],
45
- "complexity": [0, 30],
46
- "computed-property-spacing": [
47
- "error",
48
- "never"
49
- ],
50
- "consistent-return": "off",
51
- "consistent-this": "off",
52
- "curly": "off",
53
- "default-case": "error",
54
- "dot-location": "off",
55
- "dot-notation": "off",
56
- "eol-last": "off",
57
- "eqeqeq": "error",
58
- "for-direction": "error",
59
- "func-call-spacing": "error",
60
- "func-name-matching": "error",
61
- "func-names": [
62
- "error",
63
- "never"
64
- ],
65
- "func-style": "off",
66
- "function-paren-newline": "off",
67
- "generator-star-spacing": "off",
68
- "getter-return": "error",
69
- "global-require": "off",
70
- "guard-for-in": "off",
71
- "handle-callback-err": "off",
72
- "id-blacklist": "error",
73
- "id-length": "off",
74
- "id-match": "error",
75
- "indent": "off",
76
- "indent-legacy": "off",
77
- "init-declarations": "off",
78
- "jsx-quotes": "error",
79
- "key-spacing": "off",
80
- "keyword-spacing": "off",
81
- "line-comment-position": "off",
82
- "linebreak-style": "off",
83
- "lines-around-comment": "off",
84
- "lines-around-directive": "off",
85
- "max-depth": [0, 5],
86
- "max-len": "off",
87
- "max-lines": "off",
88
- "max-nested-callbacks": "error",
89
- "max-params": "off",
90
- "max-statements": "off",
91
- "max-statements-per-line": "off",
92
- "new-parens": "error",
93
- "newline-after-var": "off",
94
- "newline-before-return": "off",
95
- "newline-per-chained-call": "off",
96
- "no-alert": "error",
97
- "no-array-constructor": "error",
98
- "no-await-in-loop": "off",
99
- "no-bitwise": "error",
100
- "no-buffer-constructor": "off",
101
- "no-caller": "error",
102
- "no-catch-shadow": "error",
103
- "no-confusing-arrow": "error",
104
- "no-continue": "off",
105
- "no-div-regex": "error",
106
- "no-duplicate-imports": "error",
107
- "no-else-return": "off",
108
- "no-empty-function": "off",
109
- "no-empty": "off",
110
- "no-eq-null": "error",
111
- "no-eval": "error",
112
- "no-extend-native": "error",
113
- "no-extra-bind": "error",
114
- "no-extra-label": "error",
115
- "no-extra-parens": "off",
116
- "no-floating-decimal": "error",
117
- "no-implicit-coercion": "off",
118
- "no-implicit-globals": "error",
119
- "no-implied-eval": "error",
120
- "no-inline-comments": "off",
121
- "no-inner-declarations": [
122
- "error",
123
- "functions"
124
- ],
125
- "no-invalid-this": "off",
126
- "no-iterator": "error",
127
- "no-label-var": "error",
128
- "no-labels": "error",
129
- "no-lone-blocks": "off",
130
- "no-lonely-if": "error",
131
- "no-loop-func": "off",
132
- "no-magic-numbers": "off",
133
- "no-mixed-operators": "error",
134
- "no-mixed-requires": "warn",
135
- "no-multi-assign": "error",
136
- "no-multi-spaces": "off",
137
- "no-multi-str": "error",
138
- "no-multiple-empty-lines": "off",
139
- "no-native-reassign": "error",
140
- "no-negated-condition": "off",
141
- "no-negated-in-lhs": "error",
142
- "no-nested-ternary": "off",
143
- "no-new": "error",
144
- "no-new-func": "error",
145
- "no-new-object": "error",
146
- "no-new-require": "error",
147
- "no-new-wrappers": "error",
148
- "no-octal-escape": "off",
149
- "no-param-reassign": "off",
150
- "no-path-concat": "off",
151
- "no-plusplus": "off",
152
- "no-process-env": "off",
153
- "no-process-exit": "off",
154
- "no-proto": "error",
155
- "no-prototype-builtins": "off",
156
- "no-restricted-globals": "error",
157
- "no-restricted-imports": "error",
158
- "no-restricted-modules": "error",
159
- "no-restricted-properties": "error",
160
- "no-restricted-syntax": "error",
161
- "no-return-assign": "error",
162
- "no-return-await": "error",
163
- "no-script-url": "error",
164
- "no-self-compare": "error",
165
- "no-sequences": "error",
166
- "no-shadow": "off",
167
- "no-shadow-restricted-names": "error",
168
- "no-spaced-func": "error",
169
- "no-sync": "off",
170
- "no-tabs": "error",
171
- "no-template-curly-in-string": "error",
172
- "no-ternary": "off",
173
- "no-throw-literal": "error",
174
- "no-trailing-spaces": "off",
175
- "no-undef-init": "error",
176
- "no-undefined": "off",
177
- "no-underscore-dangle": "off",
178
- "no-unmodified-loop-condition": "error",
179
- "no-unneeded-ternary": "off",
180
- "no-unused-expressions": "error",
181
- "no-use-before-define": "off",
182
- "no-useless-call": "error",
183
- "no-useless-computed-key": "error",
184
- "no-useless-concat": "error",
185
- "no-useless-constructor": "off",
186
- "no-useless-rename": "error",
187
- "no-useless-return": "warn",
188
- "no-var": "off",
189
- "no-void": "error",
190
- "no-warning-comments": "error",
191
- "no-whitespace-before-property": "error",
192
- "no-with": "error",
193
- "object-curly-newline": "off",
194
- "object-curly-spacing": "off",
195
- "object-property-newline": "off",
196
- "object-shorthand": "off",
197
- "one-var": "off",
198
- "one-var-declaration-per-line": "warn",
199
- "no-unused-vars": "warn",
200
- "operator-assignment": [
201
- "error",
202
- "always"
203
- ],
204
- "operator-linebreak": [
205
- "error",
206
- "before"
207
- ],
208
- "padded-blocks": "off",
209
- "padding-line-between-statements": "error",
210
- "prefer-arrow-callback": "off",
211
- "prefer-const": "off",
212
- "prefer-destructuring": "off",
213
- "prefer-numeric-literals": "error",
214
- "prefer-promise-reject-errors": "error",
215
- "prefer-reflect": "off",
216
- "prefer-rest-params": "off",
217
- "prefer-spread": "error",
218
- "prefer-template": "off",
219
- "quote-props": "off",
220
- "quotes": "off",
221
- "radix": [
222
- "error",
223
- "always"
224
- ],
225
- "require-await": "off",
226
- "require-jsdoc": "off",
227
- "rest-spread-spacing": "error",
228
- "semi": "off",
229
- "semi-spacing": "off",
230
- "semi-style": [
231
- "error",
232
- "last"
233
- ],
234
- "sort-imports": "error",
235
- "sort-keys": "off",
236
- "sort-vars": "warn",
237
- "space-before-blocks": "off",
238
- "space-before-function-paren": "off",
239
- "space-in-parens": [
240
- "error",
241
- "never"
242
- ],
243
- "space-infix-ops": "off",
244
- "space-unary-ops": "off",
245
- "spaced-comment": "off",
246
- "strict": "off",
247
- "switch-colon-spacing": "error",
248
- "symbol-description": "off",
249
- "template-curly-spacing": "error",
250
- "template-tag-spacing": "error",
251
- "unicode-bom": [
252
- "error",
253
- "never"
254
- ],
255
- "valid-jsdoc": "warn",
256
- "vars-on-top": "off",
257
- "wrap-iife": "error",
258
- "wrap-regex": "error",
259
- "yield-star-spacing": "error",
260
- "yoda": "off",
261
- "no-console": "off",
262
- "require-yield": "off"
263
- }
264
- };