@conecli/cone-render 0.9.1-shop2.26 → 0.9.1-shop2.28

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 (33) hide show
  1. package/dist/api/index.ts +1 -1
  2. package/dist/assets/icon_blue_info.svg +1 -0
  3. package/dist/common/const.ts +1 -1
  4. package/dist/common/index.h5.ts +1 -1
  5. package/dist/common/index.jd.ts +1 -1
  6. package/dist/common/index.ts +1 -1
  7. package/dist/common/pageType.ts +1 -1
  8. package/dist/common/sgmCustomCode.ts +1 -1
  9. package/dist/common/token/token.jd.ts +1 -1
  10. package/dist/components/base/CustomVideo/common.ts +1 -0
  11. package/dist/components/base/CustomVideo/index.tsx +1 -1
  12. package/dist/components/base/Price/Base/index.tsx +1 -1
  13. package/dist/components/base/Price/Double/index.tsx +1 -1
  14. package/dist/components/debug/DebugLayout/index.module.scss +67 -0
  15. package/dist/components/debug/DebugLayout/index.tsx +1 -0
  16. package/dist/components/debug/DebugLayout/utils.ts +1 -0
  17. package/dist/components/floorItem.tsx +1 -1
  18. package/dist/components/isv/Floor/index.tsx +1 -1
  19. package/dist/interface/component.ts +1 -1
  20. package/dist/interface/service.ts +1 -1
  21. package/dist/jumpEventReport/index.weapp.ts +1 -1
  22. package/dist/modules/ContainerFloorList/index.h5.tsx +1 -1
  23. package/dist/modules/ContainerFloorList/index.tsx +1 -1
  24. package/dist/service/http/colorSign.ts +1 -1
  25. package/dist/service/http/h5Http.ts +1 -0
  26. package/dist/service/http/index.h5.ts +1 -0
  27. package/dist/service/requestServer.h5.ts +1 -0
  28. package/dist/utils/h5Utils.ts +1 -1
  29. package/dist/utils/index.h5.ts +1 -1
  30. package/dist/utils/index.ts +1 -1
  31. package/dist/utils/index.weapp.ts +1 -1
  32. package/dist/utils/utils.ts +1 -1
  33. package/package.json +1 -1
@@ -1 +1 @@
1
- import {
2
1
  isApp,
3
2
  isIOS,
4
3
  getAppVersion,
5
4
  version,
6
5
  getUUID,
7
6
  getUrlQuery,
8
7
  assign,
9
8
  isString,
10
9
  isObject,
11
10
  serialize,
12
11
  isAndroid,
13
12
  versionCompare,
14
13
  isIPad,
15
14
  CHANNEL_TYPE,
16
15
  JDShopViewBusinessPathType,
17
16
  JDShopViewBusinessPathList,
18
17
  SECTION_HOME_TAB_NAME_TYPE,
19
18
  SECTION_HOME_TAB_TYPE,
20
19
  DraBuryPointFlags,
21
20
  parseQueryUrlObj,
22
21
  if (window?.__sgm__) {
23
22
  resolve(true)
24
23
  } else {
25
24
  if (isSgmReadyError) {
26
25
  console.log("当前sgm初始化失败")
27
26
  reject(false)
28
27
  } else {
29
28
  ready('__sgm__', 2000).then(() => {
30
29
  isSgmReadyError = false
31
30
  console.log("当前sgm初始化成功")
32
31
  resolve(true)
33
32
  }).catch(() => {
34
33
  isSgmReadyError = true
35
34
  console.log("当前sgm初始化失败")
36
35
  reject(false)
37
36
  })
38
37
  }
39
38
  }
40
39
  console.log(message)
41
40
  reject(new Error(message))
42
41
  return ready('dra', 2000)
43
42
  .then(() => {
44
43
  isNewDraSdkReadyError = false
45
44
  console.log('当前新版烛龙sdk初始化成功')
46
45
  return true
47
46
  })
48
47
  .catch(() => {
49
48
  isNewDraSdkReadyError = true
50
49
  throw new Error('当前新版烛龙sdk初始化失败')
51
50
  })
52
51
  return new Promise((resolve, reject) => {
53
52
  if (window?.dra) {
54
53
  resolve(true)
55
54
  } else if (isNewDraSdkReadyError) {
56
55
  logAndReject('当前新版烛龙sdk初始化失败', reject)
57
56
  } else {
58
57
  initializeDraSdk()
59
58
  .then(resolve)
60
59
  .catch(error => logAndReject(error.message, reject))
61
60
  }
62
61
  })
63
62
  try {
64
63
  return JSON.parse(decodeURIComponent(getUrlQuery('cookie')))
65
64
  } catch (e) {
66
65
  return {}
67
66
  }
68
67
  isWxMiniH5View && urlCookie['wxapp_type'] == '1'
69
68
  if (isH5AdnJxMini) {
70
69
  return 'jxxcx'
71
70
  } else if (isTJApp) {
72
71
  return 'tjapp'
73
72
  } else if (isTjM) {
74
73
  return 'tjm'
75
74
  } else if (isTjJxM) {
76
75
  return 'jxh5'
77
76
  }
78
77
  return ''
79
78
  START: 'start',
80
79
  MOVE: 'move',
81
80
  END: 'end',
82
81
  x: 0,
83
82
  y: 0
84
83
  const startX = startPos.x
85
84
  const startY = startPos.y
86
85
  const endX = touchEvent.clientX
87
86
  const endY = touchEvent.clientY
88
87
  const dy = startY - endY
89
88
  const dx = endX - startX
90
89
  let result = 0
91
90
  if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
92
91
  return result
93
92
  }
94
93
  const angle = Math.atan2(dy,dx) * 180 / Math.PI
95
94
  if (angle >= -45 && angle < 45) {
96
95
  result = 4
97
96
  } else if (angle >= 45 && angle < 135) {
98
97
  result = 1
99
98
  } else if (angle >= -135 && angle < -45) {
100
99
  result = 2
101
100
  } else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
102
101
  result = 3
103
102
  }
104
103
  return result
105
104
  if (isJdApp && e) {
106
105
  const touchEvent =
107
106
  e?.originalEvent?.targetTouches[0] || e?.targetTouches[0]
108
107
  let _touchState = touchType
109
108
  let _getDirectionState = false
110
109
  if(touchType === TouchType.START){
111
110
  StopNativeScrollEventPos.x = touchEvent.clientX
112
111
  StopNativeScrollEventPos.y = touchEvent.clientY
113
112
  }else if(touchType === TouchType.MOVE){
114
113
  _getDirectionState = [1,2].includes(touchMoveGetSlideDirection(StopNativeScrollEventPos,touchEvent))
115
114
  if(_getDirectionState){
116
115
  _touchState = TouchType.END
117
116
  }
118
117
  console.log("对外提供阻止横滑方法,当前touchType为move,设定1、2向上或向下方向,当前计算后的滑动是否为纵向", _getDirectionState)
119
118
  }else if(touchType === TouchType.END){
120
119
  StopNativeScrollEventPos.x = 0
121
120
  StopNativeScrollEventPos.y = 0
122
121
  }
123
122
  isIosDevice
124
123
  ? iosDeviceStopNativeScrollEvent(e, _touchState, stopTouchDocumentScrollState)
125
124
  : androidDeviceStopNativeScrollEvent(_touchState, stopTouchDocumentScrollState)
126
125
  if(!isAppHomeForMarketPage && stopTouchDocumentScrollState && _touchState === TouchType.START){
127
126
  rootEleNode && rootEleNode.classList.add('over-hidden')
128
127
  }
129
128
  if(_touchState === TouchType.MOVE && _getDirectionState){
130
129
  rootEleNode && rootEleNode.classList.contains('over-hidden') && rootEleNode.classList.remove('over-hidden')
131
130
  }else if (_touchState === TouchType.END) {
132
131
  setTimeout(() => {
133
132
  rootEleNode && rootEleNode.classList.contains('over-hidden') && rootEleNode.classList.remove('over-hidden')
134
133
  },isAppHomeForMarketPage || _getDirectionState ? 0 : 200)
135
134
  }
136
135
  }
137
136
  isJdApp &&
138
137
  touchType !== TouchType.MOVE &&
139
138
  isAndroidDevice &&
140
139
  window?.JdAndroid &&
141
140
  window?.JdAndroid.requestEvent(touchType === TouchType.START)
142
141
  console.log("对外提供阻止安卓横滑方法,true-禁止外部事件H5可滑动,false-外部拦截h5事件,当前touchType为",touchType,"当前非move触发requestEvent状态为",touchType === TouchType.START,"当前stopTouchDocumentScrollState为",stopTouchDocumentScrollState)
143
142
  e && e.stopPropagation();
144
143
  console.log("对外提供阻止ios横滑方法,当前touchType为", touchType, "当前stopTouchDocumentScrollState为",stopTouchDocumentScrollState)
145
144
  window?.webkit?.messageHandlers?.MobileNavi?.postMessage?.({
146
145
  method: 'callRouterModuleWithParams',
147
146
  params: {
148
147
  routerURL: 'router://JDShopModule/processShoph5SlideState',
149
148
  routerParam: {
150
149
  slideDirection: 'horizontal',
151
150
  state: touchType,
152
151
  },
153
152
  callBackId: new Date().getTime(),
154
153
  },
155
154
  })
156
155
  if (isH5AndJdShopView) {
157
156
  return (
158
157
  CHANNEL_TYPE[currentChannel] ||
159
158
  CHANNEL_TYPE[JDShopViewBusinessPathType.HOME]
160
159
  )
161
160
  }
162
161
  return null
163
162
  isH5 && isJdApp && ['/app/home', '/app/classify', '/member/shopcard','/favorite/list', '/favorite/home'].includes(urlPathname)
164
163
  isH5 && isJdApp && !['/app/home'].includes(urlPathname)
165
164
  return isJdApp ? versionCompare(nowVersion, compareVersion) : -2
166
165
  getSgmReadyPromise().then(() => {
167
166
  if (
168
167
  customObj.hasOwnProperty('code') &&
169
168
  customObj.code.indexOf(NO_ENVIRONMENT_AND_PAGE_TYPE_FLAG) !== -1
170
169
  ) {
171
170
  const originCode = customObj.code.substring(
172
171
  NO_ENVIRONMENT_AND_PAGE_TYPE_FLAG.length,
173
172
  customObj.code.length,
174
173
  )
175
174
  customObj['code'] = getSgmCustomCode(handleSgmCodeTaroVersion(originCode))
176
175
  }
177
176
  const getCustomObj = {
178
177
  type: 1,
179
178
  code: 'all',
180
179
  cost1: 1,
181
180
  ...customObj
182
181
  }
183
182
  try {
184
183
  window.__sgm__.custom(getCustomObj, '9HwAEg@fTtWBB3EnwA5VgLT')
185
184
  } catch (e) {
186
185
  console.log("当前sgm上报异常, 原始数据为",JSON.stringify(customObj))
187
186
  }
188
187
  }).catch(() => {
189
188
  console.error("当前页面sgm加载异常,无法进行异常上报, 原始数据为",JSON.stringify(customObj))
190
189
  })
191
190
  try {
192
191
  await getNewDraSdkReadyPromise()
193
192
  const draBurypointFlag = name ?? DraBuryPointFlags.INTERFACE
194
193
  const commonObj = {
195
194
  shopId: `${global.info.queryInfo.shopId || ''}`,
196
195
  venderId: `${global.info.queryInfo.venderId || ''}`,
197
196
  environmentType: getEnvironmentType(),
198
197
  pageType: getPageType(),
199
198
  }
200
199
  try {
201
200
  window.dra.sendCustomEvent(
202
201
  {
203
202
  name: draBurypointFlag,
204
203
  metrics: {
205
204
  timeStamp: Date.now(),
206
205
  },
207
206
  context: {
208
207
  ...commonObj,
209
208
  ...customObj
210
209
  },
211
210
  },
212
211
  true,
213
212
  )
214
213
  } catch (e) {
215
214
  console.error(
216
215
  '当前新版烛龙sdk上报异常, 原始数据为',
217
216
  JSON.stringify(customObj),
218
217
  'e',
219
218
  e,
220
219
  )
221
220
  }
222
221
  } catch (e) {
223
222
  console.error(
224
223
  '当前页面新版烛龙sdk加载异常,无法进行异常上报, 原始数据为',
225
224
  JSON.stringify(customObj),
226
225
  'e',
227
226
  e
228
227
  )
229
228
  }
230
229
  draCustomReport(customObj, DraBuryPointFlags.REMOTE)
231
230
  if(isJdAndAndroidDevice && typeof displayObj === 'object'){
232
231
  const deviceRatio = window?.devicePixelRatio
233
232
  Object.keys(displayObj).forEach(key => {
234
233
  if(key === 'nativeHeaderHeight'){
235
234
  displayObj[key] = Math.ceil(displayObj[key] / (deviceRatio * deviceRatio) - 2)
236
235
  }else {
237
236
  displayObj[key] = Math.ceil(displayObj[key] / deviceRatio)
238
237
  }
239
238
  })
240
239
  }
241
240
  return displayObj
241
+ import {
242
242
  isApp,
243
243
  isIOS,
244
244
  getAppVersion,
245
245
  version,
246
246
  getUUID,
247
247
  getUrlQuery,
248
248
  assign,
249
249
  isString,
250
250
  isObject,
251
251
  serialize,
252
252
  isAndroid,
253
253
  versionCompare,
254
254
  isIPad,
255
255
  CHANNEL_TYPE,
256
256
  JDShopViewBusinessPathType,
257
257
  SECTION_HOME_TAB_NAME_TYPE,
258
258
  SECTION_HOME_TAB_TYPE,
259
259
  DraBuryPointFlags,
260
260
  MPAAS_CONFIG_APP_VERSION,
261
261
  parseQueryUrlObj,
262
262
  if (window?.__sgm__) {
263
263
  resolve(true)
264
264
  } else {
265
265
  if (isSgmReadyError) {
266
266
  console.log("当前sgm初始化失败")
267
267
  reject(false)
268
268
  } else {
269
269
  ready('__sgm__', 2000).then(() => {
270
270
  isSgmReadyError = false
271
271
  console.log("当前sgm初始化成功")
272
272
  resolve(true)
273
273
  }).catch(() => {
274
274
  isSgmReadyError = true
275
275
  console.log("当前sgm初始化失败")
276
276
  reject(false)
277
277
  })
278
278
  }
279
279
  }
280
280
  console.log(message)
281
281
  reject(new Error(message))
282
282
  return ready('dra', 2000)
283
283
  .then(() => {
284
284
  isNewDraSdkReadyError = false
285
285
  console.log('当前新版烛龙sdk初始化成功')
286
286
  return true
287
287
  })
288
288
  .catch(() => {
289
289
  isNewDraSdkReadyError = true
290
290
  throw new Error('当前新版烛龙sdk初始化失败')
291
291
  })
292
292
  return new Promise((resolve, reject) => {
293
293
  if (window?.dra) {
294
294
  resolve(true)
295
295
  } else if (isNewDraSdkReadyError) {
296
296
  logAndReject('当前新版烛龙sdk初始化失败', reject)
297
297
  } else {
298
298
  initializeDraSdk()
299
299
  .then(resolve)
300
300
  .catch(error => logAndReject(error.message, reject))
301
301
  }
302
302
  })
303
303
  try {
304
304
  return JSON.parse(decodeURIComponent(getUrlQuery('cookie')))
305
305
  } catch (e) {
306
306
  return {}
307
307
  }
308
308
  isWxMiniH5View && urlCookie['wxapp_type'] == '1'
309
309
  if (isH5AdnJxMini) {
310
310
  return 'jxxcx'
311
311
  } else if (isTJApp) {
312
312
  return 'tjapp'
313
313
  } else if (isTjM) {
314
314
  return 'tjm'
315
315
  } else if (isTjJxM) {
316
316
  return 'jxh5'
317
317
  }
318
318
  return ''
319
319
  START: 'start',
320
320
  MOVE: 'move',
321
321
  END: 'end',
322
322
  x: 0,
323
323
  y: 0
324
324
  const startX = startPos.x
325
325
  const startY = startPos.y
326
326
  const endX = touchEvent.clientX
327
327
  const endY = touchEvent.clientY
328
328
  const dy = startY - endY
329
329
  const dx = endX - startX
330
330
  let result = 0
331
331
  if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
332
332
  return result
333
333
  }
334
334
  const angle = Math.atan2(dy,dx) * 180 / Math.PI
335
335
  if (angle >= -45 && angle < 45) {
336
336
  result = 4
337
337
  } else if (angle >= 45 && angle < 135) {
338
338
  result = 1
339
339
  } else if (angle >= -135 && angle < -45) {
340
340
  result = 2
341
341
  } else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
342
342
  result = 3
343
343
  }
344
344
  return result
345
345
  if (isJdApp && e) {
346
346
  const touchEvent =
347
347
  e?.originalEvent?.targetTouches[0] || e?.targetTouches[0]
348
348
  let _touchState = touchType
349
349
  let _getDirectionState = false
350
350
  if(touchType === TouchType.START){
351
351
  StopNativeScrollEventPos.x = touchEvent.clientX
352
352
  StopNativeScrollEventPos.y = touchEvent.clientY
353
353
  }else if(touchType === TouchType.MOVE){
354
354
  _getDirectionState = [1,2].includes(touchMoveGetSlideDirection(StopNativeScrollEventPos,touchEvent))
355
355
  if(_getDirectionState){
356
356
  _touchState = TouchType.END
357
357
  }
358
358
  console.log("对外提供阻止横滑方法,当前touchType为move,设定1、2向上或向下方向,当前计算后的滑动是否为纵向", _getDirectionState)
359
359
  }else if(touchType === TouchType.END){
360
360
  StopNativeScrollEventPos.x = 0
361
361
  StopNativeScrollEventPos.y = 0
362
362
  }
363
363
  isIosDevice
364
364
  ? iosDeviceStopNativeScrollEvent(e, _touchState, stopTouchDocumentScrollState)
365
365
  : androidDeviceStopNativeScrollEvent(_touchState, stopTouchDocumentScrollState)
366
366
  if(!isAppHomeForMarketPage && stopTouchDocumentScrollState && _touchState === TouchType.START){
367
367
  rootEleNode && rootEleNode.classList.add('over-hidden')
368
368
  }
369
369
  if(_touchState === TouchType.MOVE && _getDirectionState){
370
370
  rootEleNode && rootEleNode.classList.contains('over-hidden') && rootEleNode.classList.remove('over-hidden')
371
371
  }else if (_touchState === TouchType.END) {
372
372
  setTimeout(() => {
373
373
  rootEleNode && rootEleNode.classList.contains('over-hidden') && rootEleNode.classList.remove('over-hidden')
374
374
  },isAppHomeForMarketPage || _getDirectionState ? 0 : 200)
375
375
  }
376
376
  }
377
377
  isJdApp &&
378
378
  touchType !== TouchType.MOVE &&
379
379
  isAndroidDevice &&
380
380
  window?.JdAndroid &&
381
381
  window?.JdAndroid.requestEvent(touchType === TouchType.START)
382
382
  console.log("对外提供阻止安卓横滑方法,true-禁止外部事件H5可滑动,false-外部拦截h5事件,当前touchType为",touchType,"当前非move触发requestEvent状态为",touchType === TouchType.START,"当前stopTouchDocumentScrollState为",stopTouchDocumentScrollState)
383
383
  e && e.stopPropagation();
384
384
  console.log("对外提供阻止ios横滑方法,当前touchType为", touchType, "当前stopTouchDocumentScrollState为",stopTouchDocumentScrollState)
385
385
  window?.webkit?.messageHandlers?.MobileNavi?.postMessage?.({
386
386
  method: 'callRouterModuleWithParams',
387
387
  params: {
388
388
  routerURL: 'router://JDShopModule/processShoph5SlideState',
389
389
  routerParam: {
390
390
  slideDirection: 'horizontal',
391
391
  state: touchType,
392
392
  },
393
393
  callBackId: new Date().getTime(),
394
394
  },
395
395
  })
396
396
  if (isH5AndJdShopView) {
397
397
  return (
398
398
  CHANNEL_TYPE[currentChannel] ||
399
399
  CHANNEL_TYPE[JDShopViewBusinessPathType.HOME]
400
400
  )
401
401
  }
402
402
  return null
403
403
  isH5 && isJdApp && ['/app/home', '/app/classify', '/member/shopcard','/favorite/list', '/favorite/home'].includes(urlPathname)
404
404
  isH5 && isJdApp && !['/app/home'].includes(urlPathname)
405
405
  return isJdApp ? versionCompare(nowVersion, compareVersion) : -2
406
406
  getSgmReadyPromise().then(() => {
407
407
  if (
408
408
  customObj.hasOwnProperty('code') &&
409
409
  customObj.code.indexOf(NO_ENVIRONMENT_AND_PAGE_TYPE_FLAG) !== -1
410
410
  ) {
411
411
  const originCode = customObj.code.substring(
412
412
  NO_ENVIRONMENT_AND_PAGE_TYPE_FLAG.length,
413
413
  customObj.code.length,
414
414
  )
415
415
  customObj['code'] = getSgmCustomCode(handleSgmCodeTaroVersion(originCode))
416
416
  }
417
417
  const getCustomObj = {
418
418
  type: 1,
419
419
  code: 'all',
420
420
  cost1: 1,
421
421
  ...customObj
422
422
  }
423
423
  try {
424
424
  window.__sgm__.custom(getCustomObj, '9HwAEg@fTtWBB3EnwA5VgLT')
425
425
  } catch (e) {
426
426
  console.log("当前sgm上报异常, 原始数据为",JSON.stringify(customObj))
427
427
  }
428
428
  }).catch(() => {
429
429
  console.error("当前页面sgm加载异常,无法进行异常上报, 原始数据为",JSON.stringify(customObj))
430
430
  })
431
431
  try {
432
432
  await getNewDraSdkReadyPromise()
433
433
  const draBurypointFlag = name ?? DraBuryPointFlags.BUSINESS
434
434
  const commonObj = {
435
435
  shopId: `${global.info.queryInfo.shopId || ''}`,
436
436
  venderId: `${global.info.queryInfo.venderId || ''}`,
437
437
  taroRenderVersion: window?.taroRenderVersion,
438
438
  environmentType: getEnvironmentType(),
439
439
  pageType: getPageType(),
440
440
  }
441
441
  try {
442
442
  window.dra.sendCustomEvent(
443
443
  {
444
444
  name: draBurypointFlag,
445
445
  metrics: {
446
446
  timeStamp: Date.now(),
447
447
  ...customMetricsObj
448
448
  },
449
449
  context: {
450
450
  ...commonObj,
451
451
  ...customContextObj,
452
452
  },
453
453
  },
454
454
  true,
455
455
  )
456
456
  } catch (e) {
457
457
  console.error(
458
458
  '当前新版烛龙sdk上报异常, 原始数据为',
459
459
  JSON.stringify({ ...customContextObj, ...customMetricsObj }),
460
460
  'e',
461
461
  e,
462
462
  )
463
463
  }
464
464
  } catch (e) {
465
465
  console.error(
466
466
  '当前页面新版烛龙sdk加载异常,无法进行异常上报, 原始数据为',
467
467
  JSON.stringify({ ...customContextObj, ...customMetricsObj }),
468
468
  'e',
469
469
  e,
470
470
  )
471
471
  }
472
472
  draCustomReport(customContextObj, customMetricsObj, DraBuryPointFlags.REMOTE)
473
473
  customContextObj = {},
474
474
  customMetricsObj = {},
475
475
  draCustomReport(customContextObj, customMetricsObj, DraBuryPointFlags.INTERFACE)
476
476
  customContextObj = {},
477
477
  customMetricsObj = {},
478
478
  draCustomReport(
479
479
  customContextObj,
480
480
  customMetricsObj,
481
481
  DraBuryPointFlags.BUSINESS,
482
482
  )
483
483
  if(isJdAndAndroidDevice && typeof displayObj === 'object'){
484
484
  const deviceRatio = window?.devicePixelRatio
485
485
  Object.keys(displayObj).forEach(key => {
486
486
  if(key === 'nativeHeaderHeight'){
487
487
  displayObj[key] = Math.ceil(displayObj[key] / (deviceRatio * deviceRatio) - 2)
488
488
  }else {
489
489
  displayObj[key] = Math.ceil(displayObj[key] / deviceRatio)
490
490
  }
491
491
  })
492
492
  }
493
493
  return displayObj
494
494
  jdAppVersionCompare(MPAAS_CONFIG_APP_VERSION) >= 0