智能照明系统APP-本地串口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
LightingSystemApp-serial/.svn/pristine/f1/f1c3118180f96bfd827e09cb6ac...

520 lines
15 KiB

const fs = require('fs')
const fsExtra = require('fs-extra')
const path = require('path')
const merge = require('merge')
const {
normalizePath,
getFlexDirection
} = require('@dcloudio/uni-cli-shared')
const {
hasOwn,
parseStyle
} = require('../../util')
const wxPageOrientationMapping = {
auto: ['portrait-primary', 'portrait-secondary', 'landscape-primary', 'landscape-secondary'],
portrait: ['portrait-primary', 'portrait-secondary'],
landscape: ['landscape-primary', 'landscape-secondary']
}
function parseConfig (appJson) {
return {
name: 'app-config.js',
content: `__registerConfig(${JSON.stringify(appJson)});`
}
}
const _toString = Object.prototype.toString
function isPlainObject (obj) {
return _toString.call(obj) === '[object Object]'
}
function normalizeNetworkTimeout (appJson) {
if (!isPlainObject(appJson.networkTimeout)) {
appJson.networkTimeout = {
request: 60000,
connectSocket: 60000,
uploadFile: 60000,
downloadFile: 60000
}
} else {
if (typeof appJson.networkTimeout.request === 'undefined') {
appJson.networkTimeout.request = 60000
}
if (typeof appJson.networkTimeout.connectSocket === 'undefined') {
appJson.networkTimeout.connectSocket = 60000
}
if (typeof appJson.networkTimeout.uploadFile === 'undefined') {
appJson.networkTimeout.uploadFile = 60000
}
if (typeof appJson.networkTimeout.downloadFile === 'undefined') {
appJson.networkTimeout.downloadFile = 60000
}
}
}
function updateFileFlag (appJson) {
// 已经不再根据文件识别,理论可废弃此处的逻辑
if (
process.env.UNI_USING_V3 ||
process.env.UNI_USING_V3_NATIVE
) {
return
}
const nvueCompilerFilePath = path.resolve(process.env.UNI_OUTPUT_DIR, '__uniappnvuecompiler.js')
const nvueCompilerExists = fs.existsSync(nvueCompilerFilePath)
if (appJson.nvueCompiler === 'uni-app') {
if (!nvueCompilerExists) {
fsExtra.outputFile(nvueCompilerFilePath, '')
}
} else {
if (nvueCompilerExists) {
fs.unlinkSync(nvueCompilerFilePath)
}
}
const rendererFilePath = path.resolve(process.env.UNI_OUTPUT_DIR, '__uniapprenderer.js')
const rendererExists = fs.existsSync(rendererFilePath)
if (appJson.renderer === 'native') {
if (!rendererExists) {
fsExtra.outputFile(rendererFilePath, '')
}
} else {
if (rendererExists) {
fs.unlinkSync(rendererFilePath)
}
}
}
module.exports = function (pagesJson, userManifestJson) {
const {
app
} = require('../mp')(pagesJson, userManifestJson)
const manifest = {
name: 'manifest'
}
const appJson = app.content
const {
navigationBarTextStyle = 'white',
navigationBarBackgroundColor = '#000000'
} = appJson.window || {}
const TABBAR_HEIGHT = 50
let manifestJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, './manifest.json'), 'utf8'))
// 状态栏
manifestJson.plus.statusbar = {
immersed: 'supportedDevice',
style: navigationBarTextStyle === 'black' ? 'dark' : 'light',
background: navigationBarBackgroundColor
}
// 用户配置覆盖默认配置
manifestJson = merge.recursive(
true,
manifestJson, {
id: userManifestJson.appid || '',
name: userManifestJson.name || '',
description: userManifestJson.description || '',
version: {
name: userManifestJson.versionName,
code: userManifestJson.versionCode
}
}, {
plus: userManifestJson['app-plus']
}
)
const splashscreenOptions = userManifestJson['app-plus'] && userManifestJson['app-plus'].splashscreen
const hasAlwaysShowBeforeRender = splashscreenOptions && hasOwn(splashscreenOptions, 'alwaysShowBeforeRender')
// 转换为老版本配置
if (manifestJson.plus.modules) {
manifestJson.permissions = manifestJson.plus.modules
delete manifestJson.plus.modules
}
const distribute = manifestJson.plus.distribute
if (distribute) {
if (distribute.android) {
manifestJson.plus.distribute.google = distribute.android
delete manifestJson.plus.distribute.android
}
if (distribute.ios) {
manifestJson.plus.distribute.apple = distribute.ios
delete manifestJson.plus.distribute.ios
}
if (distribute.sdkConfigs) {
manifestJson.plus.distribute.plugins = distribute.sdkConfigs
delete manifestJson.plus.distribute.sdkConfigs
}
}
// 屏幕启动方向
if (manifestJson.plus.screenOrientation) { // app平台优先使用 manifest 配置
manifestJson.screenOrientation = manifestJson.plus.screenOrientation
delete manifestJson.plus.screenOrientation
} else if (appJson.window && appJson.window.pageOrientation) { // 兼容微信小程序
const pageOrientationValue = wxPageOrientationMapping[appJson.window.pageOrientation]
if (pageOrientationValue) {
manifestJson.screenOrientation = pageOrientationValue
}
}
// 地图坐标系
if (manifestJson.permissions && manifestJson.permissions.Maps) {
manifestJson.permissions.Maps.coordType = 'gcj02'
}
if (!manifestJson.permissions) {
manifestJson.permissions = {}
}
const nvuePages = process.env.UNI_USING_V3_NATIVE ? pagesJson.pages : (pagesJson.nvue && pagesJson.nvue.pages)
if (nvuePages && nvuePages.length) {
const pages = {}
nvuePages.forEach(({
path,
style
}) => {
pages[path] = {
window: parseStyle(style),
nvue: true
}
})
appJson.nvue = {
pages
}
if (process.env.UNI_USING_V3_NATIVE) {
appJson.nvue.entryPagePath = nvuePages[0]
} else if (pagesJson.nvue.entryPagePath) {
appJson.nvue.entryPagePath = pagesJson.nvue.entryPagePath
}
// nvue 权限
manifestJson.permissions.UniNView = {
description: 'UniNView原生渲染'
}
} else if (process.env.UNI_USING_V8) {
// nvue 权限
manifestJson.permissions.UniNView = {
description: 'UniNView原生渲染'
}
}
// 启动页面配置
if (process.env.NODE_ENV === 'development') {
const condition = pagesJson.condition
if (condition && Array.isArray(condition.list) && condition.list.length) {
const list = condition.list
let current = parseInt(condition.current) || 0
if (current < 0) {
current = 0
}
if (current >= list.length) {
current = 0
}
manifestJson.plus.arguments = JSON.stringify(list[current])
}
}
// 允许内联播放视频
manifestJson.plus.allowsInlineMediaPlayback = true
const addRenderAlways = function () {
// "render": "always"
if (!manifestJson.plus.launchwebview) {
manifestJson.plus.launchwebview = {
render: 'always'
}
} else if (!manifestJson.plus.launchwebview.render) {
manifestJson.plus.launchwebview.render = 'always'
}
}
if (appJson.tabBar && appJson.tabBar.list && appJson.tabBar.list.length) {
// 安全区配置 仅包含 tabBar 的时候才配置
if (!manifestJson.plus.safearea) {
manifestJson.plus.safearea = {
background: appJson.tabBar.backgroundColor || '#FFFFFF',
bottom: {
offset: 'auto'
}
}
}
if (!process.env.UNI_USING_COMPONENTS) { // 非自定义组件模式下,仍旧添加 render always
addRenderAlways()
}
} else {
addRenderAlways()
}
let flexDir = false
if (process.env.UNI_USING_NVUE_COMPILER) {
appJson.nvueCompiler = 'uni-app'
flexDir = getFlexDirection(manifestJson.plus)
} else {
appJson.nvueCompiler = 'weex'
}
if (manifestJson.plus.renderer === 'native') {
appJson.renderer = 'native'
} else {
appJson.renderer = 'auto'
}
updateFileFlag(appJson)
appJson.splashscreen = {
alwaysShowBeforeRender: false, // 是否启用白屏检测 关闭 splash
autoclose: false // 是否 uni-app 框架关闭 splash
}
// 强制白屏检测
if (manifestJson.plus.splashscreen) {
if (!hasAlwaysShowBeforeRender && manifestJson.plus.splashscreen.autoclose === false) { // 兼容旧版本仅配置了 autoclose 为 false
manifestJson.plus.splashscreen.alwaysShowBeforeRender = false
}
if (manifestJson.plus.splashscreen.alwaysShowBeforeRender) { // 白屏检测
if (!manifestJson.plus.splashscreen.target) {
manifestJson.plus.splashscreen.target = 'id:1'
}
manifestJson.plus.splashscreen.autoclose = true
manifestJson.plus.splashscreen.delay = 0
appJson.splashscreen.alwaysShowBeforeRender = true
} else { // 不启用白屏检测
delete manifestJson.plus.splashscreen.target
if (manifestJson.plus.splashscreen.autoclose) { // 启用 uni-app 框架关闭 splash
manifestJson.plus.splashscreen.autoclose = false // 原 5+ autoclose 改为 false
appJson.splashscreen.autoclose = true
}
}
delete manifestJson.plus.splashscreen.alwaysShowBeforeRender
}
appJson.appname = manifestJson.name
if (!manifestJson.plus.distribute) {
manifestJson.plus.distribute = {
plugins: {}
}
}
if (!manifestJson.plus.distribute.plugins) {
manifestJson.plus.distribute.plugins = {}
}
// 录音支持 mp3
manifestJson.plus.distribute.plugins.audio = {
mp3: {
description: 'Android平台录音支持MP3格式文件'
}
}
// 有效值为 close,none
if (!['close', 'none'].includes(manifestJson.plus.popGesture + '')) {
manifestJson.plus.popGesture = 'close'
}
// 检查原生混淆选项
const confusion = manifestJson.plus.confusion
if (confusion && confusion.resources) {
const resources = {}
const nvuePages = (appJson.nvue && appJson.nvue.pages) || {}
for (const key in confusion.resources) {
if (path.extname(key) === '.js') { // 支持 js 混淆,过滤掉
continue
}
if (!/\.nvue$/.test(key)) {
throw new Error(`原生混淆仅支持 nvue 页面,错误的页面路径:${key}`)
} else {
resources[key.replace(/\.nvue$/, '.js')] = confusion.resources[key]
}
if (!Object.keys(nvuePages).find(path => {
const subNVues = nvuePages[path].window.subNVues || []
// TODO
return (path.replace(/\.html$/, '.nvue') === key || path.replace(/\.html$/, '.nvue') + '.nvue' === key) || subNVues.find(({
path
}) => path === key.replace(/\.nvue$/, ''))
}) && !pagesJson.pages.find(({
style = {}
}) => {
style = Object.assign(style, style['app-plus'])
const subNVues = style.subNVues || []
return subNVues.find(({
path
}) => path === key.replace(/\.nvue$/, ''))
})) {
throw new Error(`原生混淆页面未在项目内使用,错误的页面路径:${key}`)
}
}
confusion.resources = resources
}
// uni-app
const uniApp = require('../../../package.json')['uni-app']
manifestJson.plus['uni-app'] = uniApp
// 控制页类型
const control = (process.env.UNI_USING_V3 || process.env.UNI_USING_V3_NATIVE)
? 'uni-v3'
: (process.env.UNI_USING_V8 ? 'v8' : 'webview')
manifestJson.plus['uni-app'].control = control
manifestJson.plus['uni-app'].nvueCompiler = appJson.nvueCompiler
// v3 + native 时强制 auto
manifestJson.plus['uni-app'].renderer = process.env.UNI_USING_V3_NATIVE
? 'auto'
: appJson.renderer
if (flexDir) {
manifestJson.plus['uni-app'].nvue = {
'flex-direction': flexDir
}
}
// 记录编译器版本号
appJson.compilerVersion = uniApp.compilerVersion
if (process.env.UNI_USING_V8) {
let entryPagePath = appJson.pages[0]
let conditionPagePath = false
if (manifestJson.plus.arguments) {
try {
const args = JSON.parse(manifestJson.plus.arguments)
if (args && (args.path || args.pathName)) {
entryPagePath = conditionPagePath = args.path || args.pathName
}
} catch (e) {}
}
let isNVueEntryPage = appJson.nvue && appJson.nvue.entryPagePath
conditionPagePath = process.env.UNI_CLI_LAUNCH_PAGE_PATH || conditionPagePath
if (conditionPagePath && appJson.nvue) {
isNVueEntryPage = `${conditionPagePath}.html` in appJson.nvue.pages
}
manifestJson.plus.useragent.value = 'uni-app'
manifestJson.launch_path = '__uniappview.html'
Object.assign(manifestJson.plus.launchwebview, {
id: '1',
kernel: 'WKWebview',
'uni-app': 'auto'
})
if (process.env.UNI_USING_NATIVE) {
appJson.entryPagePath = appJson.nvue.entryPagePath
// networkTimeout
normalizeNetworkTimeout(appJson)
appJson.page = Object.create(null)
appJson.pages = Object.keys(appJson.nvue.pages).map(pagePath => {
const newPagePath = pagePath.replace('.html', '')
appJson.page[newPagePath] = {
window: appJson.nvue.pages[pagePath].window,
nvue: true
}
return newPagePath
})
delete appJson.nvue
delete manifestJson.plus.launchwebview.kernel
manifestJson.launch_path = ''
Object.assign(manifestJson.plus.launchwebview, {
uniNView: {
path: appJson.entryPagePath
}
})
} else if (isNVueEntryPage) {
// 非纯 nvue 项目首页为 nvue 页面
manifestJson.plus.launchwebview.id = '2'
manifestJson.plus.launchwebview.render = 'always'
}
// 带 tab
if (pagesJson.tabBar && pagesJson.tabBar.list && pagesJson.tabBar.list.length) {
const tabBar = manifestJson.plus.tabBar = Object.assign({}, pagesJson.tabBar)
const borderStyles = {
black: 'rgba(0,0,0,0.4)',
white: 'rgba(255,255,255,0.4)'
}
let borderStyle = tabBar.borderStyle
if (!borderStyle) {
borderStyle = 'black'
}
if (borderStyle in borderStyles) {
tabBar.borderStyle = borderStyles[borderStyle]
}
if (!tabBar.selectedColor) {
tabBar.selectedColor = '#0062cc'
}
tabBar.height = `${parseFloat(tabBar.height) || TABBAR_HEIGHT}px`
// 非纯 nvue 项目首页为 nvue 页面
if (!process.env.UNI_USING_NATIVE && isNVueEntryPage) {
manifestJson.plus.launchwebview.id = '2'
} else {
// 首页是 tabBar 页面
const item = tabBar.list.find(page => page.pagePath === (process.env.UNI_USING_NATIVE ? appJson.entryPagePath
: entryPagePath))
if (item) {
tabBar.child = ['lauchwebview']
tabBar.selected = tabBar.list.indexOf(item)
}
}
}
}
if (!process.env.UNI_USING_COMPONENTS) {
manifestJson.plus.launchwebview.kernel = 'UIWebview'
}
manifest.content = manifestJson
const subPackages = []
// 分包合并
if (appJson.subPackages && appJson.subPackages.length) {
appJson.subPackages.forEach(subPackage => {
if (subPackage.pages && subPackage.pages.length) {
subPackage.pages.forEach(page => {
appJson.pages.push(normalizePath(path.join(subPackage.root, page)))
})
subPackages.push({
root: subPackage.root
})
}
})
}
delete appJson.subPackages
// TODO 处理纯原生
if (process.env.UNI_USING_NATIVE) {
manifest.name = 'manifest.json'
manifest.content = JSON.stringify(manifest.content)
return [manifest, parseConfig(appJson)]
}
if (process.env.UNI_USING_V3 || process.env.UNI_USING_V3_NATIVE) {
if (process.env.UNI_USING_V3 && process.env.UNI_OPT_SUBPACKAGES) {
appJson.subPackages = subPackages
}
return require('./index.v3')(appJson, manifestJson, {
manifest,
pagesJson,
normalizeNetworkTimeout
})
}
return [app, manifest]
}