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.
323 lines
8.4 KiB
323 lines
8.4 KiB
|
3 years ago
|
const fs = require('fs')
|
||
|
|
const path = require('path')
|
||
|
|
|
||
|
|
const {
|
||
|
|
parsePages,
|
||
|
|
normalizePath,
|
||
|
|
getPlatformProject,
|
||
|
|
isSupportSubPackages
|
||
|
|
} = require('@dcloudio/uni-cli-shared')
|
||
|
|
|
||
|
|
const {
|
||
|
|
updateAppJsonUsingComponents
|
||
|
|
} = require('@dcloudio/uni-cli-shared/lib/cache')
|
||
|
|
|
||
|
|
const {
|
||
|
|
darkmode,
|
||
|
|
hasTheme
|
||
|
|
} = require('@dcloudio/uni-cli-shared/lib/theme')
|
||
|
|
|
||
|
|
const {
|
||
|
|
hasOwn,
|
||
|
|
parseStyle
|
||
|
|
} = require('../util')
|
||
|
|
|
||
|
|
function defaultCopy (name, value, json) {
|
||
|
|
json[name] = value
|
||
|
|
}
|
||
|
|
|
||
|
|
const pagesJson2AppJson = {
|
||
|
|
globalStyle: function (name, value, json) {
|
||
|
|
json.window = parseStyle(value)
|
||
|
|
if (json.window.usingComponents) {
|
||
|
|
json.usingComponents = json.window.usingComponents
|
||
|
|
delete json.window.usingComponents
|
||
|
|
} else {
|
||
|
|
json.usingComponents = {}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
tabBar: function (name, value, json, fromJson) {
|
||
|
|
if (value && value.list && value.list.length) {
|
||
|
|
if (value.list.length < 2) {
|
||
|
|
console.error('tabBar.list 需至少包含2项')
|
||
|
|
}
|
||
|
|
const pages = json.pages
|
||
|
|
value.list.forEach((page, index) => {
|
||
|
|
if (!pages.includes(page.pagePath)) {
|
||
|
|
if (
|
||
|
|
!(
|
||
|
|
fromJson &&
|
||
|
|
fromJson.nvue &&
|
||
|
|
fromJson.nvue.pages &&
|
||
|
|
fromJson.nvue.pages.find(({
|
||
|
|
path
|
||
|
|
}) => path === (page.pagePath + '.html'))
|
||
|
|
)
|
||
|
|
) {
|
||
|
|
console.error(
|
||
|
|
`pages.json tabBar['list'][${index}]['pagePath'] "${page.pagePath}" 需在 pages 数组中`
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
json[name] = value
|
||
|
|
},
|
||
|
|
preloadRule: defaultCopy,
|
||
|
|
workers: defaultCopy
|
||
|
|
}
|
||
|
|
|
||
|
|
const manifestJson2AppJson = {
|
||
|
|
networkTimeout: defaultCopy,
|
||
|
|
debug: defaultCopy
|
||
|
|
}
|
||
|
|
|
||
|
|
function parseCondition (projectJson, pagesJson) {
|
||
|
|
if (process.env.NODE_ENV === 'development') { // 仅开发期间 condition 生效
|
||
|
|
// 启动Condition
|
||
|
|
const condition = getCondition(pagesJson)
|
||
|
|
if (condition) {
|
||
|
|
if (!projectJson.condition) {
|
||
|
|
projectJson.condition = {}
|
||
|
|
}
|
||
|
|
projectJson.condition.miniprogram = condition
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const pagesJson2ProjectJson = {}
|
||
|
|
|
||
|
|
const manifestJson2ProjectJson = {
|
||
|
|
|
||
|
|
name: function (name, value, json) {
|
||
|
|
if (!value) {
|
||
|
|
value = path.basename(process.env.UNI_INPUT_DIR)
|
||
|
|
if (value === 'src') {
|
||
|
|
value = path.basename(path.dirname(process.env.UNI_INPUT_DIR))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
json.projectname = value
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const platformJson2ProjectJson = {
|
||
|
|
appid: defaultCopy,
|
||
|
|
setting: defaultCopy,
|
||
|
|
miniprogramRoot: defaultCopy,
|
||
|
|
cloudfunctionRoot: defaultCopy,
|
||
|
|
qcloudRoot: defaultCopy,
|
||
|
|
pluginRoot: defaultCopy,
|
||
|
|
compileType: defaultCopy,
|
||
|
|
libVersion: defaultCopy,
|
||
|
|
projectname: defaultCopy,
|
||
|
|
packOptions: defaultCopy,
|
||
|
|
debugOptions: defaultCopy,
|
||
|
|
scripts: defaultCopy
|
||
|
|
}
|
||
|
|
|
||
|
|
function copyToJson (json, fromJson, options) {
|
||
|
|
Object.keys(options).forEach(name => {
|
||
|
|
if (hasOwn(fromJson, name)) {
|
||
|
|
options[name](name, fromJson[name], json, fromJson)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
function getCondition (pagesJson) {
|
||
|
|
const condition = pagesJson.condition
|
||
|
|
const launchPagePath = process.env.UNI_CLI_LAUNCH_PAGE_PATH || ''
|
||
|
|
const launchPageQuery = process.env.UNI_CLI_LAUNCH_PAGE_QUERY || ''
|
||
|
|
|
||
|
|
const launchPageOptions = {
|
||
|
|
id: 0,
|
||
|
|
name: launchPagePath, // 模式名称
|
||
|
|
pathName: launchPagePath, // 启动页面,必选
|
||
|
|
query: launchPageQuery // 启动参数,在页面的onLoad函数里面得到。
|
||
|
|
}
|
||
|
|
if (condition) {
|
||
|
|
let current = -1
|
||
|
|
if (Array.isArray(condition.list) && condition.list.length) {
|
||
|
|
condition.list.forEach(function (item, index) {
|
||
|
|
item.id = item.id || index
|
||
|
|
if (item.path) {
|
||
|
|
item.pathName = item.path
|
||
|
|
delete item.path
|
||
|
|
}
|
||
|
|
if (launchPagePath) {
|
||
|
|
if (item.pathName === launchPagePath && item.query === launchPageQuery) { // 指定了入口页
|
||
|
|
current = index
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
if (launchPagePath) {
|
||
|
|
if (current !== -1) { // 已存在
|
||
|
|
condition.current = current
|
||
|
|
} else { // 不存在
|
||
|
|
condition.list.push(Object.assign(launchPageOptions, {
|
||
|
|
id: condition.list.length
|
||
|
|
}))
|
||
|
|
condition.current = condition.list.length - 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return condition
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (launchPagePath) {
|
||
|
|
pagesJson.condition = {
|
||
|
|
current: 0,
|
||
|
|
list: [launchPageOptions]
|
||
|
|
}
|
||
|
|
return pagesJson.condition
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = function (pagesJson, manifestJson, project = {}) {
|
||
|
|
const app = {
|
||
|
|
pages: [],
|
||
|
|
subPackages: []
|
||
|
|
}
|
||
|
|
|
||
|
|
const subPackages = {}
|
||
|
|
|
||
|
|
parsePages(pagesJson, function (page) {
|
||
|
|
app.pages.push(page.path)
|
||
|
|
}, function (root, page, subPackage) {
|
||
|
|
if (!isSupportSubPackages()) { // 不支持分包
|
||
|
|
app.pages.push(normalizePath(path.join(root, page.path)))
|
||
|
|
} else {
|
||
|
|
if (!subPackages[root]) {
|
||
|
|
subPackages[root] = {
|
||
|
|
root,
|
||
|
|
pages: []
|
||
|
|
}
|
||
|
|
Object.keys(subPackage).forEach(name => {
|
||
|
|
if (['root', 'pages'].indexOf(name) === -1) {
|
||
|
|
subPackages[root][name] = subPackage[name]
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
subPackages[root].pages.push(page.path)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
Object.keys(subPackages).forEach(root => {
|
||
|
|
app.subPackages.push(subPackages[root])
|
||
|
|
})
|
||
|
|
|
||
|
|
copyToJson(app, pagesJson, pagesJson2AppJson)
|
||
|
|
|
||
|
|
copyToJson(app, manifestJson, manifestJson2AppJson)
|
||
|
|
|
||
|
|
if (app.usingComponents) {
|
||
|
|
updateAppJsonUsingComponents(app.usingComponents)
|
||
|
|
}
|
||
|
|
|
||
|
|
if (darkmode() && hasTheme()) {
|
||
|
|
app.darkmode = true
|
||
|
|
app.themeLocation = 'theme.json'
|
||
|
|
}
|
||
|
|
|
||
|
|
const projectName = getPlatformProject()
|
||
|
|
|
||
|
|
const projectPath = projectName && path.resolve(process.env.VUE_CLI_CONTEXT || process.cwd(), projectName)
|
||
|
|
|
||
|
|
if (projectPath && fs.existsSync(projectPath)) { // 自定义 project.config.json
|
||
|
|
const platform = process.env.UNI_PLATFORM
|
||
|
|
|
||
|
|
// app-plus时不需要处理平台配置到 app 中
|
||
|
|
if (platform !== 'app-plus' && hasOwn(manifestJson, platform)) {
|
||
|
|
const platformJson = manifestJson[platform] || {}
|
||
|
|
|
||
|
|
const projectKeys = Object.keys(platformJson2ProjectJson)
|
||
|
|
|
||
|
|
Object.keys(platformJson).forEach(key => {
|
||
|
|
if (
|
||
|
|
!projectKeys.includes(key) && ['usingComponents', 'optimization'].indexOf(key) === -1
|
||
|
|
) {
|
||
|
|
// usingComponents 是编译模式开关,需要过滤,不能拷贝到 app
|
||
|
|
app[key] = platformJson[key]
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
if (process.env.UNI_PLATFORM === 'mp-weixin' || process.env.UNI_PLATFORM === 'mp-qq') { // 微信不需要生成,其他平台做拷贝
|
||
|
|
return {
|
||
|
|
app: {
|
||
|
|
name: 'app',
|
||
|
|
content: app
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
app: {
|
||
|
|
name: 'app',
|
||
|
|
content: app
|
||
|
|
},
|
||
|
|
project: {
|
||
|
|
name: 'project.config',
|
||
|
|
content: require(projectPath)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
parseCondition(project, pagesJson)
|
||
|
|
|
||
|
|
copyToJson(project, pagesJson, pagesJson2ProjectJson)
|
||
|
|
|
||
|
|
copyToJson(project, manifestJson, manifestJson2ProjectJson)
|
||
|
|
|
||
|
|
const platform = process.env.UNI_PLATFORM
|
||
|
|
|
||
|
|
// app-plus时不需要处理平台配置到 app 中
|
||
|
|
if (platform !== 'app-plus' && hasOwn(manifestJson, platform)) {
|
||
|
|
const platformJson = manifestJson[platform] || {}
|
||
|
|
|
||
|
|
copyToJson(project, platformJson, platformJson2ProjectJson)
|
||
|
|
|
||
|
|
const projectKeys = Object.keys(platformJson2ProjectJson)
|
||
|
|
|
||
|
|
Object.keys(platformJson).forEach(key => {
|
||
|
|
if (!projectKeys.includes(key) && ['usingComponents', 'optimization'].indexOf(key) === -1) {
|
||
|
|
// usingComponents 是编译模式开关,需要过滤,不能拷贝到 app
|
||
|
|
app[key] = platformJson[key]
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// 引用了原生小程序组件,自动开启 ES6=>ES5
|
||
|
|
const wxcomponentsPath = path.resolve(process.env.UNI_INPUT_DIR, './wxcomponents')
|
||
|
|
if (fs.existsSync(wxcomponentsPath)) {
|
||
|
|
const wxcomponentsFiles = fs.readdirSync(wxcomponentsPath)
|
||
|
|
if (wxcomponentsFiles.length) {
|
||
|
|
if (!project.setting) {
|
||
|
|
project.setting = {}
|
||
|
|
}
|
||
|
|
project.setting.es6 = true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (process.env.UNI_AUTOMATOR_WS_ENDPOINT) {
|
||
|
|
if (!project.setting) {
|
||
|
|
project.setting = {}
|
||
|
|
}
|
||
|
|
// automator时,强制不检测域名
|
||
|
|
project.setting.urlCheck = false
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!project.appid) {
|
||
|
|
project.appid = 'touristappid'
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
app: {
|
||
|
|
name: 'app',
|
||
|
|
content: app
|
||
|
|
},
|
||
|
|
project: {
|
||
|
|
name: 'project.config',
|
||
|
|
content: project
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|